题目: 子集
来自智得网
方法一:回溯法
回溯法是一种解决子集问题的常见方法。它基于深度优先搜索(DFS)和递归实现。回溯法用于解决的问题通常可以表示为树形结构,其中每个节点代表一个解的部分或完整的解。回溯法通过在每个节点上进行决策,搜索整个树,以找到所有解决方案。
下面是使用回溯法来解决Leecode的子集问题的示例代码:
python Copy code class Solution:
def subsets(self, nums: List[int]) -> List[List[int]]: n = len(nums) res = [] def backtrack(start, path): res.append(path) for i in range(start, n): backtrack(i+1, path+[nums[i]]) backtrack(0, []) return res
方法二:位运算
使用位运算可以很方便地生成子集。我们可以用一个二进制数来表示一个子集,例如,对于集合{1,2,3},000表示空集,001表示{1},010表示{2},011表示{1,2},以此类推。那么,我们只需要枚举从0到2^n-1之间的所有数字,将每个数字转换为二进制数,根据二进制数的每个位是否为1来判断该位对应的数是否在子集中,即可得到所有子集。
下面是使用位运算来解决Leecode的子集问题的示例代码:
python Copy code class Solution:
def subsets(self, nums: List[int]) -> List[List[int]]: n = len(nums) res = [] for i in range(1 << n): path = [] for j in range(n): if i & (1 << j): path.append(nums[j]) res.append(path) return res
方法三:迭代法
迭代法也是一种解决子集问题的有效方法。与回溯法和位运算不同,迭代法是通过将每个数字插入到前面的每个子集中来生成新的子集。
下面是使用迭代法来解决Leecode的子集问题的示例代码:
python Copy code class Solution:
def subsets(self, nums: List[int]) -> List[List[int]]: res = [[]] for num in nums: for i in range(len(res)): res.append(res[i]+[num]) return res