class Solution {
public List<List<Integer>> permute(int[] nums) {
List<List<Integer>> res = new ArrayList<List<Integer>>();
List<Integer> output = new ArrayList<Integer>();
for (int num : nums) {
output.add(num);
}
int n = nums.length;
backtrack(n, output, res, 0);
return res;
}
public void backtrack(int n, List<Integer> output, List<List<Integer>> res, int first) {
// 所有数都填完了
if (first == n) {
res.add(new ArrayList<Integer>(output));
}
for (int i = first; i < n; i++) {
// 动态维护数组
Collections.swap(output, first, i);
// 继续递归填下一个数
backtrack(n, output, res, first + 1);
// 撤销操作
Collections.swap(output, first, i);
}
}
}
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/permutations/solution/quan-pai-lie-by-leetcode-solution-2/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
1、为什么不同的output能被加到同一个res????
因为res在之前被修改了,再被传入下一次backtrack。
首先得到i = first,即第一个为first的output,继续调用backtrack直到第一次出现output n个都安排了,这时res有了1个元素。(第一个是按原顺序排列,第二个是最后两位交换...add到res有明确的先后顺序)
2、为什么void方法可以修改传入变量output、backtrack的值?
JAVA函数可以修改传入的变量,但只能是类的实例变量,基本数据类型不行。
类的实例变量:List<Integer> a = new ArrayList<>();
基本数据类型:int a;