題目
解題
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