深度优先搜索、回溯思想

题目

给定一个 没有重复数字的序列,返回其所有可能的全排列。

示例:

输入: [1,2,3]
输出:
[
  [1,2,3],
  [1,3,2],
  [2,1,3],
  [2,3,1],
  [3,1,2],
  [3,2,1]
]

题解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Solution:
def permute(self, nums):# nums: list[int] ,返回值:list[list[int]]
# 定义路径列表,track
if len(nums)==0:
return []
track=[]
res=[]
self.backtrack(nums,track,res)
return res
def backtrack(self,nums,track,res): # 回溯实现
# 如果track长度等于nums长度,即一种选择,放入res中
if len(track)==len(nums):
res.append(track[:]) # 变量track列表指向是地址,深度优先遍历完成以后,回到了根结点,成为空列表。所以这里做一个拷贝
return
for i in range(len(nums)):
if nums[i] in track:
continue

track.append(nums[i])
self.backtrack(nums,track,res)
track.pop()
1
2
3
4
if __name__=='__main__':
nums=[1,2,3]
a = Solution()
print(a.permute(nums))
[[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]]