[LeetCode] 47. Permutations II

来源:互联网 发布:易语言qq空间秒赞源码 编辑:程序博客网 时间:2024/06/08 02:52

Given a collection of numbers that might contain duplicates, return all possible unique permutations.

For example,
[1,1,2] have the following unique permutations:

[  [1,1,2],  [1,2,1],  [2,1,1]]
// 26msclass Solution {public:    vector<vector<int>> permuteUnique(vector<int>& nums) {        vector<vector<int>> res;        permuteUnique(res, nums, 0);        return res;    }private:    void permuteUnique(vector<vector<int>>& res, vector<int>& nums, int nth) {        if (nth == nums.size()) {            res.push_back(nums);            return;        }        unordered_map<int, bool> IsUsed;        for (int i = nth; i < nums.size(); i++) {            if (IsUsed[nums[i]] == false) {                IsUsed[nums[i]] = true;                swap(nums[nth], nums[i]);                permuteUnique(res, nums, nth + 1);                swap(nums[nth], nums[i]);            }        }    }};

这里写图片描述这里写图片描述

// 22msclass Solution {public:    vector<vector<int>> permuteUnique(vector<int>& nums) {        vector<vector<int>> res;        vector<int> comb;        vector<bool> IsUsed(nums.size(), false);        sort(nums.begin(), nums.end());        permuteUnique(res, comb, nums, 0, IsUsed);        return res;    }private:    void permuteUnique(vector<vector<int>>& res, vector<int>& comb, vector<int>& nums, int nth, vector<bool>& IsUsed) {        if (nth == nums.size()) {            res.push_back(comb);            return;        }        for (int i = 0, nxt; i < nums.size(); i = nxt) {            if (IsUsed[i]) {                nxt = i + 1;                continue;            }            for (nxt = i; nxt < nums.size() && nums[nxt] == nums[i]; nxt++)                ;            comb.push_back(nums[i]);            IsUsed[i] = true;            permuteUnique(res, comb, nums, nth + 1, IsUsed);            IsUsed[i] = false;            comb.pop_back();        }    }};

这里写图片描述22ms

原创粉丝点击