统计按位或能得到最大值的子集数目
难度:中等
数组每个元素只有 在子集中 和 不在子集中 这 两种 状态,那么容易想到可以利用状态压缩,我们可以使用一个 int 的二进制位枚举所有状态,每个二进制位中的 1 表示选,0 表示不选,计算每种状态的或值,看是不是最大的即可。
代码如下:
public int countMaxOrSubsets(int[] nums) {
int n = nums.length;
int max = 0;
for (int num : nums) {
max |= num;
}
int ans = 0;
for (int mask = 0; mask < 1<<n; mask++) {
int cur = 0;
for (int i = 0; i < n; i++) {
if (((mask>>i)&1)==1){
cur |= nums[i];
//判断的同时剪枝
if (cur == max){
ans++;
break;
}
}
}
}
return ans;
}
执行结果:成功