题目: 子集
来自智得网
方法一:回溯法
回溯法是一种解决子集问题的常见方法。它基于深度优先搜索(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