给定一个没有重复数字的序列,返回其所有可能的全排列。
示例:
输入: [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>> permute(int[] nums) {
List<List<Integer>> list = new ArrayList<>();
if (nums == null || nums.length == 0) {
return list;
}
int[] index = new int[nums.length];
dfs(list,new ArrayList<Integer>(),index,nums);
return list;
}
public void dfs(List<List<Integer>> list, ArrayList<Integer> tmp,int[] index,int[] nums) {
if (tmp.size() == nums.length) {
list.add(new ArrayList<>(tmp));
return;
}
for (int i = 0;i < nums.length;i++) {
if (index[i] == 1)
continue;
tmp.add(nums[i]);
index[i] = 1;
dfs(list,tmp,index,nums);
index[i] = 0;
tmp.remove(tmp.size()-1);
}
}
}
leetcode 47
给定一个可包含重复数字的序列,返回所有不重复的全排列。
示例:
输入: [1,1,2]
输出:
[
[1,1,2],
[1,2,1],
[2,1,1]
]
思路: 必须去重 ,先排序 ,再 i > 0 && nums[i] == nums[i-1]还必须加上
index[i-1] == 1.(没被访问过)
class Solution {
public List<List<Integer>> permuteUnique(int[] nums) {
Arrays.sort(nums);
List<List<Integer>> list = new ArrayList<>();
if (nums == null || nums.length == 0) {
return list;
}
int[] index = new int[nums.length];
dfs(list,new ArrayList<Integer>(),index,nums);
return list;
}
public void dfs(List<List<Integer>> list, ArrayList<Integer> tmp,int[] index,int[] nums) {
if (tmp.size() == nums.length) {
list.add(new ArrayList<>(tmp));
return;
}
for (int i = 0;i < nums.length;i++) {
if (index[i] == 1)
continue;
if (i >0 && nums[i] == nums[i-1] && index[i-1] == 0)
continue;
tmp.add(nums[i]);
index[i] = 1;
dfs(list,tmp,index,nums);
index[i] = 0;
tmp.remove(tmp.size()-1);
}
}
}