17. 子集
中文English
给定一个含不同整数的集合,返回其所有的子集。
样例
样例 1:
输入:[0]
输出:
[
[],
[0]
]
样例 2:
输入:[1,2,3]
输出:
[
[3],
[1],
[2],
[1,2,3],
[1,3],
[2,3],
[1,2],
[]
]
挑战
你可以同时用递归与非递归的方式解决么?
注意事项
子集中的元素排列必须是非降序的,解集必须不包含重复的子集。
输入测试数据 (每行一个参数)如何理解测试数据?
DFS + 回溯
class Solution: """ @param nums: A set of numbers @return: A list of lists """ ''' 大致思路: 1.循环,取出所有符合的子集,最后加[]进来,返回 ''' def subsets(self, nums): #dfs方法 results = [] nums.sort() self.dfs(results, [], nums, 0) return results #递归的定义 def dfs(self, results, array, nums, curindex): #递归的出口,注意,这里如果是往下走不了的话,不用加return if array not in results: results.append(list(array)) #递归的拆解 for i in range(curindex, len(nums)): array.append(nums[i]) self.dfs(results, array, nums, i + 1) array.pop()
18. 子集 II
中文English
给定一个可能具有重复数字的列表,返回其所有可能的子集。
样例
样例 1:
输入:[0]
输出:
[
[],
[0]
]
样例 2:
输入:[1,2,2]
输出:
[
[2],
[1],
[1,2,2],
[2,2],
[1,2],
[]
]
挑战
你可以同时用递归与非递归的方式解决么?
注意事项
- 子集中的每个元素都是非降序的
- 两个子集间的顺序是无关紧要的
- 解集中不能包含重复子集
class Solution: """ @param nums: A set of numbers. @return: A list of lists. All valid subsets. """ def subsetsWithDup(self, nums): # write your code here #dfs写法 + 回溯 results = [] nums.sort() self.dfs(results, [], nums, 0) return results #递归的定义 def dfs(self, results, array, nums, curindex): #递归的出口 if array not in results: results.append(list(array)) #递归的拆解 for i in range(curindex, len(nums)): array.append(nums[i]) #其中i + 1,则下一次会自动从下一个元素开始,不会在取这次元素 self.dfs(results, array, nums, i + 1) array.pop()