回溯步骤
result = []
def backtrack(路径, 选择列表):
if 满足结束条件:
result.add(路径)
return
for 选择 in 选择列表:
做选择
backtrack(路径, 选择列表)
撤销选择
注意回溯的三要素:1、有效的结果 2、回溯的范围及答案更新 3、剪枝条件
给定一个没有重复数字的序列,返回其所有可能的全排列。
示例:
输入: [1,2,3]
输出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
class Solution(object):
def permute(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
ret = []
def backtrack(nums, temp):
# 有效的结果
if nums==[]:
ret.append(temp)
return
for i in range(len(nums)):
# 每次从nums中取出一个数到temp中,直到nums为空
backtrack(nums[:i] + nums[i+1:], temp + [nums[i]])
backtrack(nums, [])
return ret
全排列2
给定一个可包含重复数字的序列,返回所有不重复的全排列。
示例:
输入: [1,1,2]
输出:
[
[1,1,2],
[1,2,1],
[2,1,1]
]
class Solution(object):
def permuteUnique(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
ret = []
nums.sort() # 对原始的数据进行排序
def backtrack(nums, temp):
if nums==[]:
# if temp not in ret:
ret.append(temp)
return
for i in range(len(nums)):
# 如果列表中有相同的数,则只需要计算第一个数即可,后面的可以跳过
# 如果是排序之后的数据,只需要计算当前的数是否和前一个数是一样的,
# 如果是一样的,就跳过
if i>=1 and nums[i]==nums[i-1]:
continue
backtrack(nums[:i] + nums[i+1:], temp + [nums[i]])
backtrack(nums, [])
return ret