LeetCode/46. 全排列

46. 全排列

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

示例 :

1
2
3
4
5
6
7
8
9
10
输入: [1,2,3]
输出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]

来源:力扣(LeetCode)
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题解:

本题的思想就是回溯,也可以说是一种暴力破解方法。我们不断的在递归之前将未出现的元素添加到track数组,在递归之后从track数组剔除元素并尝试加入下一个元素,最终遍历完所有的情况

具体代码如下:

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 {
//存放结果数组
List<List<Integer>> res = new LinkedList<>();

public List<List<Integer>> permute(int[] nums) {
//记录路径
LinkedList<Integer> track = new LinkedList<>();
backtrack(nums, track);
return res;
}

void backtrack(int[] nums, LinkedList<Integer> track) {
//触发结束条件
if (track.size() == nums.length) {
res.add(new LinkedList<Integer>(track));
return;
}

for (int i = 0; i < nums.length; i++) {
//排除不合法的选择
if (track.contains(nums[i])) {
continue;
}
//将track中未出现的元素加入
track.add(nums[i]);
backtrack(nums, track);
//剔除最后一个元素,尝试下一个不同的元素
track.removeLast();
}
}
}

Comments