Leetcode5759. 找出所有子集的异或总和再求和(二进制模拟暴搜)

Posted !0 !

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Leetcode5759. 找出所有子集的异或总和再求和(二进制模拟暴搜)相关的知识,希望对你有一定的参考价值。

题目链接:https://leetcode-cn.com/problems/sum-of-all-subset-xor-totals/

解题思路

我们可以用一个数i ( 0 ≤ i ≤ 2 n − 1 ) (0 \\leq i \\leq 2^n - 1) (0i2n1)表示一个集合,数i的第j位表示第j个数是否属于当前枚举的集合,如果属于就进行异或操作。

代码

class Solution {
    public int subsetXORSum(int[] nums) {
        int n = nums.length;
        int res = 0;    
        for (int i = 0; i < 1 << n; i ++ ) {    //i从0~2^n - 1
            int s = 0;
            for (int j = 0; j < n; j ++ )   //判断每一位是否属于当前集合
                if ((i >> j & 1) != 0)  //如果是1则属于该集合
                    s ^= nums[j];   
            res += s;   //将每次结果加入答案
        }
        return res;
    }
}

复杂度分析

  • 时间复杂度:O( 2 n ∗ n 2^n * n 2nn)
  • 空间复杂度:O(1)

以上是关于Leetcode5759. 找出所有子集的异或总和再求和(二进制模拟暴搜)的主要内容,如果未能解决你的问题,请参考以下文章

通过位操作来遍历子集 leetcode题5759

LeetCode第241场周赛

1863. 找出所有子集 的异或总和 再求和回溯

算法学习1863. 找出所有子集的异或总和再求和(java / c / c++ / python / go / rust)

算法学习1863. 找出所有子集的异或总和再求和(java / c / c++ / python / go / rust)

LeetCode刷题1863-简单-找出所有子集的异或和