题解 | #有重复项数字的全排列#
有重复项数字的全排列
https://www.nowcoder.com/practice/a43a2b986ef34843ac4fdd9159b69863
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param num int整型一维数组 * @return int整型ArrayList<ArrayList<>> */ //储存数组 ArrayList<ArrayList<Integer>> res=new ArrayList<>(); public ArrayList<ArrayList<Integer>> permuteUnique (int[] num) { // write code here //数组排序 Arrays.sort(num); //调用排序函数 LinkedList<Integer> list=new LinkedList<>(); boolean[] used=new boolean[num.length]; backTrack(num,list,used); return res; } public void backTrack(int[] num,LinkedList<Integer> list,boolean[] used){ //递归结束的条件 if(list.size()==num.length){ res.add(new ArrayList<>(list)); } //函数逻辑 //没有出现过的数字,加入数组,之前我们用的list.contains,但是现在有重复元素了,所有不能用了,我们现在用used[i]这个标识,为true表示加过了,跳过i for(int i=0;i<num.length;i++){ if(used[i]){ continue; } //当前的值和上一个添加的值相等 if(i>0&&num[i]==num[i-1]&&used[i-1]){ continue; } list.add(num[i]); //添加完了 将该数字的标识改成用过了 used[i]=true; backTrack(num,list,used); //回溯 list.removeLast(); //下一分支 used[i]=false; } } }