题目描述
给定一个没有重复数字的序列,返回其所有可能的全排列。
示例: 输入: [1,2,3]
输出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
解题思路
典型的回溯递归问题。
注意,在向结果list中添加path的时候,要深拷贝!
package leetcode_1;
import java.util.ArrayList;
import java.util.List;
public class LeetCode46_permute {
public List<List<Integer>> permute(int[] nums) {
int len = nums.length;
List<List<Integer>> res = new ArrayList<>();
List<Integer> path = new ArrayList<>();
boolean[] used = new boolean[len];//标记是否用过
for (int i = 0;i < len;i++) {
used[i] = false;
}
dfs(nums,len,0,path,used,res);
return res;
}
private void dfs(int[] nums, int len, int curLen, List<Integer> path, boolean[] used, List<List<Integer>> res) {
if (curLen == len) {
//res.add(path);
res.add(new ArrayList<>(path));//注意要深拷贝
return;
}
for (int i = 0;i < len;i++) {
if (!used[i]) {
path.add(nums[i]);
used[i] = true;
dfs(nums,len,curLen + 1,path,used,res);//表示在前边固定的情况下,后边有多少种可能。
used[i] = false; //状态要重置
path.remove(curLen); //回溯!
}
}
}
public static void main(String[] args) {
int[] nums = {1, 2, 3};
LeetCode46_permute lp = new LeetCode46_permute();
List<List<Integer>> lists = lp.permute(nums);
System.out.println(lists);
}
}