这一类型题目都有一个共同的特点,通过对树的遍历来解决这种问题。说来惭愧,是根据一篇博文上的java改过来的。
全排列:[1,2,3]排列可能,没有重复元素
全排列二:包含重复元素,所以在排列过程中会出现重复现象,只需要修改判断语句if not nums and tmp not in res:
即可
class Solution: def peemute(self, nums): res = [ ] n = len(nums) def backtrack(nums,tmp): if not nums: res.append(tmp) for i in range(n): backtrack(nums[:i]+nums[i+1:], tmp+[nums[i]]) backtrack(nums,[ ]) return res
接下来开始说说子集问题:
给定一个数组[1,2,3]一共有多少个子集?是2的指数个。这个和上面题目是几乎一样的方法回溯
class Solution:
def subsets(self, nums):
if not nums:
return []
res = []
n = len(nums)
def backtrack(epoch,tmp):
res.append(tmp)
for i in range(epoch, n):
backtrack(eopch + 1, tmp+[nums[i]])
backtrack(0,[])
return res
如果是有重复元素的,和之前全排列的问题一样。修改条件if tmp not in res
即可