2275. 按位与结果大于零的最长组¶
难度:中等
题目¶
对数组 nums
执行 按位与 相当于对数组 nums
中的所有整数执行 按位与 。
例如,对 nums = [1, 5, 3]
来说,按位与等于 1 & 5 & 3 = 1
。
同样,对 nums = [7]
而言,按位与等于 7
。
给你一个正整数数组 candidates
。计算 candidates
中的数字每种组合下 按位与 的结果。
返回按位与结果大于 0
的 最长 组合的长度。
示例 1:
输入:
candidates = [16,17,71,62,12,24,14]
输出:
4
解释:组合
[16,17,62,24]
的按位与结果是16 & 17 & 62 & 24 = 16 > 0
。组合长度是
4
。可以证明不存在按位与结果大于
0
且长度大于4
的组合。注意,符合长度最大的组合可能不止一种。
例如,组合
[62,12,24,14]
的按位与结果是62 & 12 & 24 & 14 = 8 > 0
。
示例 2:
输入:
candidates = [8,8]
输出:
2
解释:最长组合是
[8,8]
,按位与结果8 & 8 = 8 > 0
。组合长度是
2
,所以返回2
。
提示:
1 <= candidates.length <= 10^5
1 <= candidates[i] <= 10^7
题解¶
按位与的结果,如果非零,则其中至少一位为1。为1的这一位,需要整个数组中所有数的这一位都必须是1才能满足结果为1。因此,按位与所能达到的最长的组合长度,恰好等于数组中同一bit位置为1的最大数字个数。只需要依序检查每个数字,统计各个bit为1的次数即可。
import math
class Solution:
def largestCombination(self, candidates: List[int]) -> int:
highest_bit = int(math.log2(max(candidates))) + 1
bits = {(2 ** i): 0 for i in range(highest_bit)}
for k in bits:
for num in candidates:
if num & k:
bits[k] += 1
return max(bits.values())