Leetcode47 全排列2

Leetcode47 全排列2此题与全排列1的不同在于 :有重复数字

因此首先需要对数组进行排序 然后对同一树层的数字去重

class Solution {
    List<List<Integer>> res=new ArrayList<>();//结果数组
    LinkedList<Integer> path=new LinkedList<>(); //路径数组 
    public List<List<Integer>> permuteUnique(int[] nums) {
        Arrays.sort(nums);   //对数组进行排序
        boolean[] used=new boolean[nums.length]; //记录同一树层某数字是否被使用
    dfs(nums,0,used);
   return res;
    }
    public void dfs(int[] nums,int start,boolean[] used){
        if(path.size()==nums.length)    //若路径数组长度等于目标数组长度
        {
            res.add(new ArrayList<>(path));  //添加至结果数组中
            return;
        }
        for(int i=0;i<nums.length;i++){      //遍历数组(为树层上的遍历)
            //如果前一个数与当前数相同 则直接进行下一次循环 
            // i>0是为了防止(i-1)索引超出数组范围` 
            if(i>0&&nums[i]==nums[i-1]&&used[i-1]) 
            {
                continue;
            }
            if(!used[i]){      //这一步即与全排列相同
            path.add(nums[i]);
            used[i]=true;
            dfs(nums,i,used);
            used[i]=false;
            path.removeLast();
            }
        }
    }
}

 

上一篇:Elasticsearch学习系列之多文档操作mget


下一篇:LeetCode-869.重新排列得到2的幂