当前位置:实例文章 » 其他实例» [文章]【LeetCode】78.子集

【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]]


### 总结本题目要求生成一个集合的所有可能子集。我们提供了两种方法来解决这个问题:递归法和位运算法。递归法使用递归函数来生成所有可能的子集,而位运算法使用位运算来计算子集的数量。

其他信息

其他资源

Top