Permutations II

2019-10-22  本文已影响0人  Ukuleler
捕获.PNG

这道题和Permutations类似,不同的是,现在包含了重复的数字,那么思路相同,还是利用dp,只不过首先进行排序,并且遇到重复的就略过比如1,1,2。那么要做的排序就只有1和2,重复的那个1就被略过。代码如下

public class permuteUnique {
    public static List<List<Integer>> permuteUnique(int[] nums) {
        Arrays.sort(nums);
        List<List<Integer>> res =permute(nums);
        return res;
    }

    public static List<List<Integer>> permute(int[] nums) {
        List<List<Integer>> res =new ArrayList<>();
        if(nums.length==1){
            List<Integer> temp = new ArrayList<>();
            temp.add(nums[0]);
            res.add(temp);
            return res;
        }
        int[] tempNums = new int[nums.length-1];
        int pre=0;
        for(int i=0;i<nums.length;i++){
            if(i>0 && pre==nums[i]){
                continue;
            }
            pre=nums[i];
            for(int j=0;j<tempNums.length;j++){
                if(j<i){
                    tempNums[j]=nums[j];
                }else if(j>=i){
                    tempNums[j]=nums[j+1];
                }
            }
            List<List<Integer>> templ = permute(tempNums);
            for(int k=0;k<templ.size();k++){
                List<Integer> l = templ.get(k);
                l.add(nums[i]);
                templ.set(k ,l);
            }
            res.addAll(templ);
        }
        return res;
    }
}

上一篇下一篇

猜你喜欢

热点阅读