Leetcode46/47之回溯中的排列问题
作者:互联网
排列问题
- 和子集问题以及组合问题不同的是每次回溯都要从头来
- 这样就要对当前元素筛选了,如果之前已经排列过了就要跳过这个元素
- 最常用的筛选方法就是boolean数组或者hashset
Leetcode46-全排列
- 给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。
- 输入:nums = [1,2,3]
- 输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
public class L46 {
//方式一用set去重
// LinkedList<List<Integer>> res = new LinkedList<>();
// LinkedList<Integer> integers = new LinkedList<>();
// Set set = new HashSet<Integer>();
//
// public List<List<Integer>> permute(int[] nums) {
// permut(nums);
// return res;
// }
//
// public void permut(int[] nums) {
// if (integers.size() == nums.length) {
// res.add(new LinkedList<>(integers));
// return;
// }
//
// for (int i = 0; i < nums.length; i++) {
// if (set.contains(i)) {
// continue;
// }
// integers.add(nums[i]);
// set.add(i);
// permut(nums);
// set.remove(i);
// integers.removeLast();
// }
// }
//方式二用boolean数组去重
List<List<Integer>> res = new ArrayList<>();
LinkedList<Integer> integers = new LinkedList<>();
public List<List<Integer>> permute(int[] nums) {
boolean[] flag = new boolean[nums.length];
pailie(nums, flag);
return res;
}
public void pailie(int[] nums, boolean[] flag) {
if (integers.size() == nums.length) {
res.add(new LinkedList<>(integers));
}
for (int i = 0; i < nums.length; i++) {
if (flag[i] == true) {
continue;
}
integers.add(nums[i]);
flag[i] = true;
pailie(nums, flag);
flag[i] = false;
integers.removeLast();
}
}
}
Leetcode47-全排列二
- 给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。
- 输入:nums = [1,1,2]
- 输出:
[[1,1,2],
[1,2,1],
[2,1,1]]
List<List<Integer>> res=new ArrayList<>();
LinkedList<Integer> integers=new LinkedList<>();
public List<List<Integer>> permuteUnique(int[] nums) {
int[] flag=new int[nums.length];
//0表示一次也没被访问过
//1表示还未结束本轮遍历 但是已经过了这个元素
//2表示本轮遍历已经结束了
Arrays.sort(nums);
pailie(nums,flag);
return res;
}
public void pailie(int[] nums,int[] flag){
if(integers.size()==nums.length){
res.add(new LinkedList<>(integers));
}
for(int i=0;i<nums.length;i++){
if(i>0 && nums[i]==nums[i-1] && flag[i-1]==2){
continue;
}
if(flag[i]==1){
continue;
}
integers.add(nums[i]);
flag[i]=1;
pailie(nums,flag);
flag[i]=2;
integers.removeLast();
}
}
标签:integers,LinkedList,nums,int,47,flag,回溯,new,Leetcode46 来源: https://www.cnblogs.com/fao99/p/16112558.html