题目
解题
1.递归算法
先创建一个空的集合作为输出结果,遍历输入的数组;对每个遍历的元素,输出集合前面的所有子集都添加这个元素;遍历结束,输出结果
代码如下:
class Solution(object):
def subsets(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
res=[[]]
for i in nums:
res+=[j+[i]for j in res]
return res
回溯算法
遍历输入数组的元素,每个元素都有添加或者不添加到自己的可能,利用这个原理使用回溯算法
回溯三要素
- 有效结果
当index==len(nums)的时候,搜索结束
if index==len(nums):
self.res.append(num)
- 回溯范围及结果更新
使用index遍历数组元素下一个元素index=index+1,结果更新考虑选或不选当前答案,保存index指向的元素
self.backtrack(num+[nums[index]], index+1, nums)
self.backtrack(num, index+1, nums)
- 剪枝条件
无
代码实现
class Solution(object):
def subsets(self, nums):
self.res = []
self.backtrack([], 0, nums)
return self.res
def backtrack(self, sol, index, nums):
if index == len(nums):
self.res.append(sol)
return
self.backtrack(sol+[nums[index]], index+1, nums)
self.backtrack(sol, index+1, nums)
调用itertools模块的combinations方法
import itertools
class Solution(object):
def subsets(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
result=[];
result.append([]);
for i in range(1,(len(nums)+1)):
#Python itertools模块的combinations方法返回muns所有长度为i的子序列
num=list(itertools.combinations(nums,i));
for j in range(len(num)):
result.append(q[j]);
return result