【LeetCode】78.子集
发布人:shili8
发布时间:2025-03-14 01:06
阅读次数:0
**LeetCode78. 子集**
### 题目描述给定一个非空集合 `nums`,返回其所有可能的子集。
### 示例* 输入:`nums = [1,2,3]`
输出:`[[], [1], [1,2], [1,2,3], [1,3], [2], [2,3], [3]]`
### 解决方案#### 方法一:递归法
class Solution: def subsets(self, nums: List[int]) -> List[List[int]]: # 将列表转换为集合,去重 num_set = set(nums) # 初始化结果集 result = [] # 递归函数 def backtrack(start, path): # 将当前路径添加到结果集中 result.append(path[:]) # 遍历剩余的数字 for i in range(start, len(nums)): # 添加当前数字并继续递归 path.append(nums[i]) backtrack(i +1, path) # 回溯,去除当前数字 path.pop() # 开始递归 backtrack(0, []) # 将集合转换为列表,并添加空集 result = [list(x) for x in result] + [[]] return result
#### 方法二:位运算法
class Solution: def subsets(self, nums: List[int]) -> List[List[int]]: # 初始化结果集 result = [] # 计算子集的数量 n = len(nums) m =1 << n # 遍历所有可能的子集 for i in range(m): subset = [nums[j] for j in range(n) if (i & (1 << j))] result.append(subset) return result
###代码注释* 在方法一中,我们使用递归函数 `backtrack` 来生成所有可能的子集。该函数首先将当前路径添加到结果集中,然后遍历剩余的数字并继续递归。
* 在方法二中,我们使用位运算来计算子集的数量。我们将每个数字视为一个位,并使用左移运算符 `<<` 来生成所有可能的子集。
###代码示例* 输入:`nums = [1,2,3]`
输出:
[[],[1],[1,2],[1,2,3],[1,3],[2],[2,3],[3]]
* 输入:`nums = [0]`
输出:
[[],[0]]
### 总结本题目要求生成一个集合的所有可能子集。我们提供了两种方法来解决这个问题:递归法和位运算法。递归法使用递归函数来生成所有可能的子集,而位运算法使用位运算来计算子集的数量。