题目

类型:位运算

image.png

解题思路

令 n 为 nums 的长度,利用 n 不超过 16 ,我们可以使用一个 int 数值来代指 nums 的使用情况(子集状态)。

假设当前子集状态为 state ,state 为一个仅考虑低 n 位的二进制数,当第 k 位为 1,代表 nums[k] 参与到当前的按位或运算,当第 k 位为 0,代表 nums[i] 不参与到当前的按位或运算。

在枚举这 统计按位或能得到最大值的子集数目 - 图2个状态过程中,我们使用变量 max 记录最大的按位或得分,使用 ans 记录能够取得最大得分的状态数量。

代码

  1. class Solution {
  2. public int countMaxOrSubsets(int[] nums) {
  3. int n = nums.length, mask = 1 << n;
  4. int max = 0, ans = 0;
  5. for (int s = 0; s < mask; s++) {
  6. int cur = 0;
  7. for (int i = 0; i < n; i++) {
  8. if (((s >> i) & 1) == 1) cur |= nums[i];
  9. }
  10. if (cur > max) {
  11. max = cur; ans = 1;
  12. } else if (cur == max) {
  13. ans++;
  14. }
  15. }
  16. return ans;
  17. }
  18. }