题解 | #有重复项数字的全排列#
有重复项数字的全排列
https://www.nowcoder.com/practice/a43a2b986ef34843ac4fdd9159b69863
import java.util.*; public class Solution { ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>(); public ArrayList<ArrayList<Integer>> permuteUnique(int[] num) { ArrayList<Integer> list = new ArrayList<Integer>(); //先使数组保持一个递增方向 利于字典序升序排序 Arrays.sort(num); dfs(num,list,new boolean[num.length]); return res; } //思路还是使用dfs进行全排列 ,进行适当剪枝 public void dfs(int num[] ,ArrayList<Integer> list ,boolean []used){ if(list.size() == num.length) { res.add(new ArrayList<>(list)); return ; } for(int i = 0 ; i < num.length ; i++){ //当前数字正在被使用 if(used[i]) continue; //如果当前这个数和上一个数相等 没有保持一个递增方向 并且上一个数已经没有被使用了 //则这次情况和上次的相同 进行剪枝 if(i > 0 && num[i - 1] == num[i] && !used[i-1]) continue; //否则 进行dfs used[i] = true; list.add(num[i]); dfs(num,list,used); list.remove(list.size()-1); used[i] = false; } } }