46. 全排列
给定一个没有重复数字的序列,返回其所有可能的全排列。
示例:
1 | 输入: [1,2,3] |
思路
- 回溯,详情见代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22# 方法一
class Solution:
def permute(self, nums: List[int]) -> List[List[int]]:
if not nums: return []
res=[]
n=len(nums)
# 使用vis数组保存访问过的元素
vis=[0]*n
def backtrack(tmp_list):
if len(tmp_list)==n:
res.append(tmp_list)
for i in range(n):
# 访问过的直接跳过
if vis[i]:
continue
# 状态置为已访问,并将tmp_list加上当前元素继续递归
vis[i]=1
backtrack(tmp_list+[nums[i]])
# 将访问状态初始化,才不会影响别的路径
vis[i]=0
backtrack([])
return res
1 | # 方法二 |
47. 全排列 II
给定一个可包含重复数字的序列,返回所有不重复的全排列。
示例:
1 | 输入: [1,1,2] |
思路:
- 本题和上题的区别在于nums会出现重复元素,这个导致全排列子集需要去重
- 因此本题的难点在于如何去重剪枝
1 | # 方法一、朴素思想 |
1 | # 方法二、记录已访问元素 |
- 本文作者: Jason
- 本文链接: https://caicaijason.github.io/2019/11/21/全排列/
- 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!