leetcode46. 全排列

leetcode46. 全排列

五月 23, 2020

leetcode46. 全排列


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

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

经典的回溯算法

遍历所有的可能性,用visited数组标记是否已经访问过,如果list的长度等于nums的长度,就说明所有的数都在里面了,要添加到最后的ans中。
回溯注意最后一步要恢复到刚进来dfs函数的状态,比如刚进来时候排列组合是 [1,2],现在添加了一个3,变为 [1,2,3] 。在回溯的时候还应该为 [1,2],应该把刚才遍历的情况删除掉。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class Solution {
public List<List<Integer>> permute(int[] nums) {
int[] visited = new int[nums.length];
int count = 1;
for (int i = 0; i < nums.length; i++) {
visited[i] = 1;
list = new LinkedList<>();
list.add(nums[i]);
dfs(nums, visited, count);
visited[i] = 0;
list.removeLast();
}
return ans;
}
public LinkedList<List<Integer>> ans = new LinkedList<>();
public LinkedList<Integer> list = new LinkedList<>();
public void dfs(int[] nums, int[] visited, int count) {
if (count == nums.length) {
ans.add(new LinkedList<>(list));
return;
}
for (int i = 0; i < nums.length; i++) {
if (visited[i] == 1) continue;//已经枚举过的就不再枚举
visited[i] = 1;//表示记录当前的点,已经枚举过了
list.add(nums[i]);
dfs(nums, visited, count + 1);
visited[i] = 0;//回溯,恢复状态
list.removeLast();//恢复状态
}
}
}

leetcode 87/100