方法二:迭代法枚举子集
提示 1
一个长度为 n 的数组 nums 有 2
n
个子集(包括空集与自身)。我们可以将这些子集一一映射到 [0,2
n
−1] 中的整数。
提示 2
数组中的每个元素都有「选取」与「未选取」两个状态,可以对应一个二进制位的 1 与 0。那么对于一个长度为 n 的数组 nums,我们也可以用 n 个二进制位的整数来唯一表示每个元素的选取情况。此时该整数第 j 位的取值表示数组第 j 个元素是否包含在对应的子集中。
思路与算法
我们也可以用迭代来实现子集枚举。
根据 提示 1 与 提示 2,我们枚举 [0,2
n
−1] 中的整数 i,其第 j 位的取值表示 nums 的第 j 个元素是否包含在对应的子集中。
对于每个整数 i,我们遍历它的每一位计算对应子集的异或总和,并维护这些值之和。
代码
class Solution {
public:
int subsetXORSum(vector& nums) {
int res = 0;
int n = nums.size();
for (int i = 0; i < (1 << n); ++i){ // 遍历所有子集
int tmp = 0;
for (int j = 0; j < n; ++j){ // 遍历每个元素
if (i & (1 << j)){
tmp ^= numsj;
}
}
res += tmp;
}
return res;
}
};