LeetCode/solutions/47. Permutations II.md
2019-01-12 16:51:27 +08:00

2.0 KiB
Raw Blame History

47. Permutations II

思路

有了31. Next Permutation46. Permutations的做题经验,这题就显得是一个送分题了。
这题与46题唯一区别就是此题允许重复元素所以需要注意在元素比较的时候相等的情况。参考46的题解即可很容易写出代码。

C++

使用STL中的next_permutations(完全同46题)

class Solution {
public:
    vector<vector<int>> permuteUnique(vector<int>& nums) {
        vector<vector<int>>res;
        if(nums.empty()) return res;
        sort(nums.begin(), nums.end()); // 先排序
        res.push_back(nums);
        while(next_permutation(nums.begin(), nums.end())) res.push_back(nums);
        return res;
    }
};

手动实现

class Solution {
private:
    bool my_next_permute(vector<int>& nums){
        int len = nums.size();
        int i = len - 1;
        while(i > 0 && nums[i] <= nums[i - 1]) i--; // 与46题的不同点一
        if(i == 0) return false;
        
        int mid, low = i, high = len - 1;
        while(low <= high){ // 二分查找
            mid = low + (high - low) / 2;
            if(nums[mid] <= nums[i - 1]) high = mid - 1;  // 与46题的不同点二
            else low = mid + 1;
        }
        
        // int high = len - 1;
        // while(nums[i - 1] >= nums[high]) high--; // 与46题的不同点二
        
        swap(nums[i - 1], nums[high]);
        reverse(nums.begin() + i, nums.end());
        return true;
    }
public:
    vector<vector<int>> permuteUnique(vector<int>& nums) {
        vector<vector<int>>res;
        if(nums.empty()) return res;
        sort(nums.begin(), nums.end()); // 先排序
        res.push_back(nums);
        while(my_next_permute(nums)) res.push_back(nums);
        return res;
    }
};