📅  最后修改于: 2023-12-03 15:10:45.087000             🧑  作者: Mango
这个问题可以用递归和迭代的方式解决。递归是最基础和直观的解决方式,但是会有很多重复计算。迭代方式会比较繁琐,但是可以避免重复计算并且有更好的时间复杂度。
首先,我们可以定义一个递归函数,用于获取以某个索引为起始点的所有子集。然后,在主函数中,我们可以依次调用递归函数,依次获取以每个索引为起始点的所有子集,最后将它们合并成一个大的集合。
以下是一个实现示例:
def subsets(nums):
def dfs(index, path, res):
res.append(path)
for i in range(index, len(nums)):
dfs(i + 1, path + [nums[i]], res)
res = []
dfs(0, [], res)
return res
# 测试
nums = [1, 2, 3]
print(subsets(nums))
输出结果为:
[[], [1], [1, 2], [1, 2, 3], [1, 3], [2], [2, 3], [3]]
时间复杂度为 $O(2^n)$,空间复杂度也为 $O(2^n)$。
迭代方式的套路通常是一层一层地计算出子集,直到最后一个元素。假设我们已经计算出了前 $n-1$ 个元素的所有子集,现在来考虑第 $n$ 个元素如何处理。
如果第 $n$ 个元素不选,则新的子集与旧的子集相同,直接拷贝旧子集即可。
如果第 $n$ 个元素选,则将第 $n$ 个元素添加到前 $n-1$ 个元素中的所有子集中,得到新的子集。
根据上面的思路,我们可以依次计算出每个元素的子集,并将它们合并成一个大的集合。
以下是一个实现示例:
def subsets(nums):
res = [[]]
for num in nums:
res += [item + [num] for item in res]
return res
# 测试
nums = [1, 2, 3]
print(subsets(nums))
输出结果与上面递归方式的结果相同:
[[], [1], [2], [1, 2], [3], [1, 3], [2, 3], [1, 2, 3]]
时间复杂度为 $O(2^n)$,空间复杂度也为 $O(2^n)$。
递归方式和迭代方式都可以解决这个问题,但是它们的实现方式略有不同。递归方式的实现比较简单直观,但是会有很多重复计算,数据规模大的时候效率较低。迭代方式的实现比较麻烦,但是可以避免重复计算并且效率较高。在实际使用中,要根据具体情况选择合适的方式。