zoukankan      html  css  js  c++  java
  • 47.Permutations II

    给定一个数组,数组中的元素有重复项,将其全排列,求出全排列的组合。

    Input: [1,1,2]
    Output:
    [
    [1,1,2],
    [1,2,1],
    [2,1,1]
    ]

    思路:
    和46题很相似,但难度比46题更大,如果不使用 set 去重的话,很难做出来。将46题的方法简单去重,再使用set,即可。

    class Solution {
    public:
        vector<vector<int>> permuteUnique(vector<int>& nums) {
            set<vector<int>> res;
            sort(nums.begin(), nums.end());
            permuteUniqueDFS(nums, 0, res);
            return vector<vector<int>>(res.begin(), res.end());
        }
    
        void permuteUniqueDFS(vector<int>& nums, int start, set<vector<int>>& res) {
            if (start == (int)nums.size()) {
                res.insert(nums); return;
            }
            for (int i = start; i < (int)nums.size(); i++) {
                if (i > start && i > 0 && ((nums[i] == nums[i - 1]) || nums[i] == nums[start])) continue;
                else {
                    swap(nums[i], nums[start]);
                    permuteUniqueDFS(nums, start + 1, res);
                    swap(nums[i], nums[start]);
                }
            }
        }
    };

    Java 版:

    class Solution {
        private Set<List<Integer>> set = new HashSet<>(); // 运用Set来去除重复项
        public List<List<Integer>> permuteUnique(int[] nums) {
            Arrays.sort(nums);
            this.permuteUniqueDFS(nums, 0);
            return new ArrayList<List<Integer>>(set); //将Set转化为List返回
        }
        private void permuteUniqueDFS(int[] nums, int idx){
            if(idx == nums.length){
                List<Integer> tmp = new ArrayList<>();
                for(int a : nums) tmp.add(a);
                set.add(tmp);return;
            }
            for(int i = idx; i < nums.length; i++){
                if(i > idx && nums[i] == nums[i-1]) continue; //适当的剪枝
                int number = nums[idx]; //swap
                nums[idx] = nums[i];
                nums[i] = number;
                this.permuteUniqueDFS(nums, idx + 1); //深搜
                nums[i] = nums[idx]; //swap
                nums[idx] = number;
            }
        }
    }
  • 相关阅读:
    势函数的构造
    10.29模拟赛总结
    10.29vp总结
    10.25模拟赛总结
    10.24模拟赛总结
    线段树练习
    一键挖矿
    P1972 [SDOI2009]HH的项链
    P3901 数列找不同
    P5546 [POI2000]公共串
  • 原文地址:https://www.cnblogs.com/luo-c/p/12977218.html
Copyright © 2011-2022 走看看