Permutations II

捕获.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;
    }
}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容