LeetCode 1863. 找出所有子集的异或总和再求和
🧩 题目描述
给定一个数组 nums
,我们要找到所有子集的异或总和,并返回这些总和的累加值。
- 子集可以为空
- 异或总和是所有元素逐位 XOR 的结果
- 数组中元素唯一,长度最大为 12
示例:
输入: nums = [1,3] 输出: 6 解释: 子集有 [], [1], [3], [1,3] 异或值分别为 0, 1, 3, 1^3=2 总和为 0+1+3+2 = 6
python
复制
编辑
💡 解题思路
这道题的关键是遍历所有子集,然后计算它们的异或值并求和。由于数组最大长度是 12,最多只有 2^12 = 4096 个子集,因此我们可以放心使用回溯法(DFS)枚举所有可能。
🧾 算法核心:
- 从
index=0
开始,对每个元素有两种选择:选或不选 - 通过递归实现所有子集的遍历
- 每当遍历到终点时,就将当前子集的异或值加到答案里
🧪 代码实现(Python)
python
class Solution:
def subsetXORSum(self, nums: List[int]) -> int:
def dfs(index, cur_xor):
if index == len(nums):
return cur_xor
# 不选 nums[index]
a = dfs(index + 1, cur_xor)
# 选 nums[index]
b = dfs(index + 1, cur_xor ^ nums[index])
return a + b
return dfs(0, 0)
✅ 复杂度分析
时间复杂度:O(2^n),n 是数组长度(最多 12)
空间复杂度:O(n),递归深度最多为 n
🏁 总结
这是一道典型的枚举所有子集的题目,思路清晰,适合练习 DFS 回溯。由于题目范围小,可以直接暴力解决。