题目描述:
给定一个没有重复数字的序列,返回其所有可能的全排列。
示例:
输入: [1,2,3] 输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ]
思路:
全排列无非就是将一组数打乱重排, 统计有几种不同的结果。那么就一个一个放呗,假如有n个数,先放第一个位置,然后n - 1个数又进行全排列,一直到最后一个数排好结束这一轮,这样的一轮是以某个数字为开头的全排列,那么我们要保证每个数字都能在最开头,只需要将每个数跟排第一个的数交换就行了,注意交换了之后,排完一次要交换回来,不然会有重复结果。
代码:
class Solution {
List<List<Integer>> res = new ArrayList<>();
public List<List<Integer>> permute(int[] nums) {
permutation(nums, 0, nums.length - 1);
return res;
}
private void permutation(int[] nums, int p, int q) {
if (p == q) {
res.add(arrayToList(nums));
}
for (int i = p; i <= q; i++) {
swap(nums, i, p);
permutation(nums, p + 1, q);
swap(nums, i, p); // 这里要交换回来,免得出现重复的情况
}
}
private List<Integer> arrayToList(int[] nums) {
List<Integer> res = new ArrayList<>();
for (int i = 0; i < nums.length; i++) {
res.add(nums[i]);
}
return res;
}
private void swap(int[] nums, int i, int j) {
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
}