题目描述
方法一:二进制枚举
记 n
是数组 nums \textit{nums} nums 的长度,数组中的每个元素都可以选取或者不选取,因此数组的非空子集数目一共有 ( 2 n − 1 ) (2^n-1) (2n−1)个。
用一个长度为 n n n 比特的整数来表示不同的子集,在整数的二进制表示中, n n n 个比特的值代表了对数组不同元素的取舍:
- 第 i i i 位值为 1 1 1 则表示该子集选取对应元素
- 第 i i i 位值为 0 0 0 则表示该子集不选取对应元素
在枚举这 2 n 2^n 2n 个状态过程中,使用变量 maxOr
记录最大的按位或得分,使用 cnt
记录能够取得最大得分的状态数量。
class Solution {
public int countMaxOrSubsets(int[] nums) {
int maxOr = 0, cnt = 0;
// i : 不同的子集
for (int i = 0; i < 1 << nums.length; i++) {
int orVal = 0;
for (int j = 0; j < nums.length; j++) {
if (((i >> j) & 1) == 1) {
// 求每个子集按位或的值
orVal |= nums[j];
}
}
if (orVal > maxOr) {
maxOr = orVal;
cnt =