2275. 按位与结果大于零的最长组合
2275. 按位与结果大于零的最长组合
题目:给定 candidates 数组,计算数组的每种组合下 按位与 的结果,返回大于 0 的最长组合的长度。
例如:candidates = [16,17,71,62,12,24,14]
,[62,12,24,14]
是长度最长的且按位与的结果大于 0 的组合之一。
当我们从二进制的位数出发,只要组合中第 k 位的所有元素按位与的结果为 1,那么这个组合就是大于 0 的。
那么遍历数组,统计在第 k 位与 1 的按位与结果为 1 的元素个数,就可以得出这个组合的长度。而且我们还需要一个变量在遍历过程纪录最大的长度。
其中对于二进制位的范围,题目给定的元素取值范围在 [ 1 , 1 0 7 ] [1,10^7] [1,107] 闭区间内,同时我们有 2 23 < 1 0 7 < 2 24 2^{23} < 10^7 < 2^{24} 223<107<224,因此我们只需要遍历 24 个二进制位即可。
class Solution {
public:int largestCombination(vector<int>& candidates) {int ans = 0;for (int i=0; i < 24; i++) {int tt = 0;// 统计在第 i 位时,与 1 按位与结果为 1 的元素个数for (auto n: candidates) if (1 & (n >> i)) tt++; ans = max(ans, tt);}return ans;}
};
/*** @param {number[]} candidates* @return {number}*/
var largestCombination = function(candidates) {let ans = 0;for (let i=0; i < 24; i++) {let tt = 0;for (n of candidates) tt += ((n >> i) & 1);ans = Math.max(tt, ans);}return ans;
};