拓展:有重复项字符的所有排列
解法1:Boolean+数组记录
import java.lang.*;
import java.util.*;
public class Solution {
public ArrayList<ArrayList<Integer>> permuteUnique(int[] num) {
ArrayList<ArrayList<Integer>> rst = new ArrayList<ArrayList<Integer>>();
if(num == null || num.length == 0){
return rst;
}
Arrays.sort(num);
boolean[] visit = new boolean[num.length];
ArrayList<Integer> list = new ArrayList<>();
fun(rst,list,visit,num);
return rst;
}
public void fun(ArrayList<ArrayList<Integer>> rst,ArrayList<Integer> list,boolean[] visit,int[] num){
if(list.size() == num.length){
rst.add(new ArrayList<Integer>(list));
}
for(int i = 0;i<num.length ;i++){
if(visit[i] == true || (i!=0&&num[i] == num[i-1] )&&visit[i-1] == false){
continue;
}
visit[i] = true;
list.add(num[i]);
fun(rst,list,visit,num);
list.remove(list.size()-1);
visit[i] = false;
}
}
}解法2:HashSet+交换
import java.util.*;
public class Solution {
ArrayList<ArrayList<Integer>> res=new ArrayList<ArrayList<Integer>>();
public ArrayList<ArrayList<Integer>> permuteUnique(int[] num) {
if (num == null || num.length < 1)
return res;
Arrays.sort(num);
process2(res,num,0);
return res;
}
public static void process2(ArrayList<ArrayList<Integer>> res,int[] num, int i) {
if (i == num.length) {
ArrayList<Integer>list=new ArrayList<Integer>();
for(int a : num){
list.add(a);
}
res.add(list);
return;
}
HashSet<Integer> set = new HashSet<>();
for (int j = i; j < num.length; j++) {
if (!set.contains(num[j])) {
set.add(num[j]);
swap(num, i, j);
process2(res, num, i + 1);
swap(num, i, j);
}
}
}
public static void swap(int[] chs, int i, int j) {
int tmp = chs[i];
chs[i] = chs[j];
chs[j] = tmp;
}
}
京公网安备 11010502036488号