有重复项数字的所有排列
题目描述
给出一组可能包含重复项的数字,返回该组数字的所有排列。
代码
import java.util.*;
public class Solution {
ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();
public ArrayList<ArrayList<Integer>> permuteUnique(int[] num) {
Arrays.sort(num);
boolean[] flag = new boolean[num.length];
helper(num,new ArrayList<Integer>(),flag);
return result;
}
public void helper(int[] num,ArrayList list,boolean[] flag){
int size= list.size();
if(num.length==size){
result.add(new ArrayList<Integer>(list));
return;
}
for(int i = 0;i<num.length;i++){
if(flag[i])continue;
//num[i]==num[i - 1]判断是否与上一个遍历值相同,避免重复
//!flag[i - 1] 判断是不是在同个循环体(层)还是嵌套的循环体(不同层)
if (i > 0 && num[i] == num[i - 1] && !flag[i - 1])continue;
list.add(num[i]);
flag[i]=true;
helper(num,list,flag);
list.remove(size);
flag[i]=false;
}
}
}