题目描述
给定一个不含重复数字的整数数组 nums ,返回其 所有可能的全排列 。可以 按任意顺序 返回答案。
示例1
输入:nums = [1,2,3]
输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
示例2
输入:nums = [0,1]
输出:[[0,1],[1,0]]
示例3
输入:nums = [1]
输出:[[1]]
思路
求n个数全排列,我们可以从低位起依次确定该位的情况,比如求[1,2,3]的全排列,步骤如下:
- 先求第一位。先让nums[0]当作第一个数,即[1,?,?],那么nums[0]之后的数也都可以当作第一个数,所以我们把他后面的数依次和它交换(当然它自己也算)。
- 确定完第一位后,递归调用函数继续确定第二位。比如现在为[1,?,?],那么第二位一开始为[1,2,?],那么同样第二位也可以和后面的数交换,成为[1,3,?],以此类推。
- 结束条件为确定完最后一位,即 i == nums.length
代码
class Solution {
public List<List<Integer>> permute(int[] nums) {
List<List<Integer>> result = new LinkedList();
dfs(nums, 0, result);
return result;
}
private void dfs(int[] nums, int i, List<List<Integer>> result){
if(i == nums.length){
LinkedList<Integer> subset = new LinkedList();
for(int num : nums){
subset.add(num);
}
result.add(subset);
}else{
for(int j = i; j < nums.length; j++){
swap(nums, i, j);
dfs(nums, i + 1, result);
swap(nums, i, j);
}
}
}
private void swap(int[] nums, int i, int j){
if(i != j){
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
}
}