1、全排列
给定一个 没有重复 数字的序列,返回其所有可能的全排列。
输入: [1,2,3]
输出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
class Solution {
public List<List<Integer>> res = new ArrayList<>();
public LinkedList<Integer> path = new LinkedList<>();
public boolean[] visited;
public List<List<Integer>> permute(int[] nums) {
if (nums == null || nums.length == 0) return res;
visited = new boolean[nums.length];
dfs(nums, 0);
return res;
}
public void dfs(int[] nums, int index) {
if (index == nums.length) {
res.add(new LinkedList<>(path));
return;
}
for (int i = 0; i < nums.length; i++) {
if (!visited[i]) {
visited[i] = true;
path.add(nums[i]);
dfs(nums, index + 1);
visited[i] = false;
path.removeLast();
}
}
}
}
2、全排列II
给定一个可包含重复数字的序列,返回所有不重复的全排列。
输入: [1,1,2]
输出:
[
[1,1,2],
[1,2,1],
[2,1,1]
]
class Solution {
public List<List<Integer>> res = new ArrayList<>();
public LinkedList<Integer> path = new LinkedList<>();
public boolean[] visited;
public List<List<Integer>> permuteUnique(int[] nums) {
if (nums == null || nums.length == 0) return res;
visited = new boolean[nums.length];
Arrays.sort(nums);
//对序列进行排序,如果nums[i] == nums[i-1] && !visited[i-1],continue
//如果你和前面的数相等,那么你必须排在它的后面
dfs(nums, 0);
return res;
}
public void dfs(int[] nums, int index) {
if (index == nums.length) {
res.add(new LinkedList<>(path));
return;
}
for (int i = 0; i < nums.length; i++) {
//确保轮流坐庄,Path的第一个元素可以是nums[i]
if (!visited[i]) {
//还没有访问过
if (i > 0 && nums[i] == nums[i-1] && !visited[i-1]) {
continue;
//比如1 1 2,如果第一个1已经在path里,那么第二个2可以加入path,否则不可以
}
visited[i] = true;
path.add(nums[i]);
dfs(nums, index + 1);
visited[i] = false;
path.removeLast();
}
}
}
}