解题思路
选取下标不同算不同的子集,所以只用考虑位置;
对于每个位置来说,子集的选取分选和不选两种状态;
因此可以用n位的二进制数表示每种子集的选取方案,从所有选取方案中取最大的;
总体复杂度O(2^n),对于给定数据范围16来说,2的16次方为65536不会超时
代码
class Solution {
public:
int countMaxOrSubsets(vector<int>& nums) {
int n = nums.size();
int ans = 0, maxval = 0;
for(int i = 0; i <= 1 << n; i++) {
int state = i, tmpval = 0;
for(int j = 0; j < n; j++) {
if(state >> j & 1) tmpval |= nums[j];
}
if(tmpval == maxval) ans++;
else if(tmpval > maxval) {
maxval = tmpval;
ans = 1;
}
}
return ans;
}
};