问题描述
Given a set of distinct integers, nums, return all possible subsets (the power set).
给定一个数据集合,求该集合的所有子集。
Note: The solution set must not contain duplicate subsets.
For example,
If nums = [1,2,3], a solution is:
[
[3],
[1],
[2],
[1,2,3],
[1,3],
[2,3],
[1,2],
[]
]
思路
深度优先算法回溯:以【1,2,3】为例
每轮都传递一个数组起始指针的值,保证遍历顺序:
第一轮:先遍历以1 开头的所有子集,1→12→123 →13
第二轮:遍历以2开头的所有子集,2→23
第三轮:遍历以3开头的所有子集,3
这样三轮遍历保证能找到全部1开头,2开头,3开头的所有子集;同时,每轮遍历后又把上轮的头元素去掉,这样不会出现重复子集。(包括空集)
解法
class Solution:
def subsets(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
def dfs(nums, index, path, res):
res.append(path)
for i in range(index, len(nums)):
dfs(nums, i + 1, path + [nums[i]], res)
res = []
nums.sort()
dfs(nums, 0, [], res)
return res