Leetcode46. 全排列 题目:
给定一个 没有重复 数字的序列,返回其所有可能的全排列。
示例:
输入: [1,2,3]
输出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
思路(回溯):
- 我们定义递归函数 output(first, output) 表示从左往右填到第first个位置,当前排列为 out。 那么整个递归函数分为两个情况:
- first==n时,说明我们已经填完了 n 个位置,找到了一个可行的解,我们将out 放入答案数组中,递归结束。
- 如果 first<n,需要考虑第 first 个位置要填哪个数。在填第 first 个数的时候我们遍历题目给定的 n 个数,如果这个数没有被标记过,尝试填入并将其标记,继续尝试填下一个位置,即调用函数 output(first + 1, output)。回溯的时候要撤销这一个位置填的数以及标记,并继续尝试其他没被标记过的数。
- 直至回溯结束。
Java AC代码:
import java.util.*;
public class Leetcode46 {
static List<List<Integer>> permute(int[] nums) {
List<List<Integer>> res = new LinkedList<>();
ArrayList<Integer> out = new ArrayList<>();
for (int num : nums) {
out.add(num);
}
output(nums.length, 0, out, res);
return res;
}
static void output(int n, int first, ArrayList<Integer> out, List<List<Integer>> res) {
if (first == n) {
res.add(new ArrayList<>(out));
}
for (int i = first; i < n; i++) {
//交换
Collections.swap(out, first, i);
output(n, first + 1, out, res);
//还原
Collections.swap(out, first, i);
}
}
public static void main(String[] args) {
List<List<Integer>> lists = permute(new int[]{1, 2, 3});
for (List<Integer> list : lists) {
System.out.println(list);
}
}
}
2020.4.25打卡