LeetCode第 47 题:全排列II(C++)

47. 全排列 II - 力扣(LeetCode)
在这里插入图片描述
类似;LeetCode第 46 题:全排列(C++)_zj-CSDN博客

只不过多了一个去重

class Solution {
public:
    vector<vector<int>> res;
    vector<int> flags;//标志位
    vector<int> tmp;
    int n;
    void dfs(vector<int> &nums){
        if(tmp.size() == n){
            res.push_back(tmp);
            return;
        }
        for(int i = 0; i < n; ++i){
            if(flags[i] == 1)   continue;
            if(i > 0 && nums[i] == nums[i-1] && flags[i-1] == 1)    continue;//去重
            flags[i] = 1;
            tmp.push_back(nums[i]);
            dfs(nums);
            flags[i] = 0;
            tmp.pop_back();
        }
    }
    vector<vector<int>> permuteUnique(vector<int>& nums) {
        n = nums.size();
        flags = vector<int>(n, 0);
        sort(nums.begin(), nums.end());//排序方便去重
        dfs(nums);
        return res;
    }
};

而其实c++标准库是有自己的全排列函数的:next_permutation(nums.begin(), nus.end()),而且自动处理重复的情况。

class Solution {
public:
    vector<vector<int>> res;
    vector<vector<int>> permuteUnique(vector<int>& nums) {
        sort(nums.begin(), nums.end());//排序方便去重
        do{
            res.push_back(nums);
        }while(next_permutation(nums.begin(), nums.end()));
        return res;
    }
};

猜你喜欢

转载自blog.csdn.net/qq_32523711/article/details/109105527
今日推荐