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;
        }
    }
}

 

posted @ 2020-05-27 22:46  星海寻梦233  阅读(99)  评论(0编辑  收藏  举报