You are given a 0-indexed positive integer array nums and a positive integer k.
A pair of numbers (num1, num2) is called excellent if the following conditions are satisfied:
- Both the numbers
num1andnum2exist in the arraynums. - The sum of the number of set bits in
num1 OR num2andnum1 AND num2is greater than or equal tok, whereORis the bitwise OR operation andANDis the bitwise AND operation.
Return the number of distinct excellent pairs.
Two pairs (a, b) and (c, d) are considered distinct if either a != c or b != d. For example, (1, 2) and (2, 1) are distinct.
Note that a pair (num1, num2) such that num1 == num2 can also be excellent if you have at least one occurrence of num1 in the array.
Example 1:
Input: nums = [1,2,3,1], k = 3 Output: 5 Explanation: The excellent pairs are the following: - (3, 3). (3 AND 3) and (3 OR 3) are both equal to (11) in binary. The total number of set bits is 2 + 2 = 4, which is greater than or equal to k = 3. - (2, 3) and (3, 2). (2 AND 3) is equal to (10) in binary, and (2 OR 3) is equal to (11) in binary. The total number of set bits is 1 + 2 = 3. - (1, 3) and (3, 1). (1 AND 3) is equal to (01) in binary, and (1 OR 3) is equal to (11) in binary. The total number of set bits is 1 + 2 = 3. So the number of excellent pairs is 5.
Example 2:
Input: nums = [5,1,1], k = 10 Output: 0 Explanation: There are no excellent pairs for this array.
Constraints:
1 <= nums.length <= 1051 <= nums[i] <= 1091 <= k <= 60
Solution
The Inclusion-Exclusion Principlebits(num1 OR num2) + bits(num1 AND num2) = bits(num1) + bits(num2)
Explanation
For all different a in nums,
counts its number of bits.
Enumerate the number of bits k1 and k2,
if k1 + k2 >= k,
we accumulate count[k1] * count[k2].
Complexity
Time O(nlogn)
Space O(n)
long long countExcellentPairs(vector<int>& A, int k) {
long long cnt[30] = {}, res = 0;
for (int a : unordered_set<int>(begin(A), end(A)))
++cnt[__builtin_popcount(a)];
for (int i = 1; i < 30; ++i)
for (int j = 1; j < 30; ++j)
if (i + j >= k)
res += cnt[i] * cnt[j];
return res;
} public long countExcellentPairs(int[] A, int k) {
long cnt[] = new long[30], res = 0;
Set<Integer> set = new HashSet<>();
for (int a : A)
set.add(a);
for (int a : set)
cnt[Integer.bitCount(a)]++;
for (int i = 1; i < 30; ++i)
for (int j = 1; j < 30; ++j)
if (i + j >= k)
res += cnt[i] * cnt[j];
return res;
} def countExcellentPairs(self, A: List[int], k: int) -> int:
c = Counter(map(int.bit_count, set(A)))
return sum(c[k1] * c[k2] for k1 in c for k2 in c if k1 + k2 >= k)Happy Learning – If you require any further information, feel free to contact me.
![[Solved] Number of Excellent Pairs LeetCode Contest Problem [Solved] Number of Excellent Pairs LeetCode Contest Problem](https://realcoder.techss24.com/wp-content/uploads/2022/07/Solved-Number-of-Excellent-Pairs-LeetCode-Contest-Problem.png)
![[Solved] First Letter to Appear Twice LeetCode Contest Problem](https://realcoder.techss24.com/wp-content/uploads/2022/07/Solved-First-Letter-to-Appear-Twice-LeetCode-Contest-Problem-300x200.png)
![[Solved] Selling Pieces of Wood Contest Problem](https://realcoder.techss24.com/wp-content/uploads/2022/06/Solved-Selling-Pieces-of-Wood-Contest-Problem-300x200.png)
![[Solved] Peak Index in a Mountain Array LeetCode Problem in Java](https://realcoder.techss24.com/wp-content/uploads/2022/06/Solved-Peak-Index-in-a-Mountain-Array-LeetCode-Problem-in-Java-300x200.png)