comments | difficulty | edit_url | rating | source | tags | ||||
---|---|---|---|---|---|---|---|---|---|
true |
Medium |
1642 |
Weekly Contest 293 Q3 |
|
The bitwise AND of an array nums
is the bitwise AND of all integers in nums
.
- For example, for
nums = [1, 5, 3]
, the bitwise AND is equal to1 & 5 & 3 = 1
. - Also, for
nums = [7]
, the bitwise AND is7
.
You are given an array of positive integers candidates
. Evaluate the bitwise AND of every combination of numbers of candidates
. Each number in candidates
may only be used once in each combination.
Return the size of the largest combination of candidates
with a bitwise AND greater than 0
.
Example 1:
Input: candidates = [16,17,71,62,12,24,14] Output: 4 Explanation: The combination [16,17,62,24] has a bitwise AND of 16 & 17 & 62 & 24 = 16 > 0. The size of the combination is 4. It can be shown that no combination with a size greater than 4 has a bitwise AND greater than 0. Note that more than one combination may have the largest size. For example, the combination [62,12,24,14] has a bitwise AND of 62 & 12 & 24 & 14 = 8 > 0.
Example 2:
Input: candidates = [8,8] Output: 2 Explanation: The largest combination [8,8] has a bitwise AND of 8 & 8 = 8 > 0. The size of the combination is 2, so we return 2.
Constraints:
1 <= candidates.length <= 105
1 <= candidates[i] <= 107
The problem requires finding the maximum length of a combination of numbers where the bitwise AND result is greater than
The time complexity is
class Solution:
def largestCombination(self, candidates: List[int]) -> int:
ans = 0
for i in range(max(candidates).bit_length()):
ans = max(ans, sum(x >> i & 1 for x in candidates))
return ans
class Solution {
public int largestCombination(int[] candidates) {
int mx = Arrays.stream(candidates).max().getAsInt();
int m = Integer.SIZE - Integer.numberOfLeadingZeros(mx);
int ans = 0;
for (int i = 0; i < m; ++i) {
int cnt = 0;
for (int x : candidates) {
cnt += x >> i & 1;
}
ans = Math.max(ans, cnt);
}
return ans;
}
}
class Solution {
public:
int largestCombination(vector<int>& candidates) {
int mx = *max_element(candidates.begin(), candidates.end());
int m = 32 - __builtin_clz(mx);
int ans = 0;
for (int i = 0; i < m; ++i) {
int cnt = 0;
for (int x : candidates) {
cnt += x >> i & 1;
}
ans = max(ans, cnt);
}
return ans;
}
};
func largestCombination(candidates []int) (ans int) {
mx := slices.Max(candidates)
m := bits.Len(uint(mx))
for i := 0; i < m; i++ {
cnt := 0
for _, x := range candidates {
cnt += (x >> i) & 1
}
ans = max(ans, cnt)
}
return
}
function largestCombination(candidates: number[]): number {
const mx = Math.max(...candidates);
const m = mx.toString(2).length;
let ans = 0;
for (let i = 0; i < m; ++i) {
let cnt = 0;
for (const x of candidates) {
cnt += (x >> i) & 1;
}
ans = Math.max(ans, cnt);
}
return ans;
}