全排列去重

全排列去重的前提要求是目标集合必须是经过排序的。

在目标集合排序的前提下,第i位变换数字前后,如果是相同的数字,就会产生重复的排列。

注意:第i位变换的意思是i位本身的变换,而不是i与i-1的比较。

题目链接:https://leetcode.cn/problems/permutations-ii

代码如下:

void dfs(const vector<int>& nums, int pos, vector<vector<int>>& result, vector<int>& cur) {
    if (pos == nums.size()) {
        result.push_back(cur);
        return;
    }

    for (int i = 0; i < nums.size(); ++i) {
        // 控制i位 and 全排列去重
        if (Visited[i] || (i > 0 && nums[i] == nums[i - 1] && !Visited[i - 1])) {
            continue;
        }
        Visited[i] = true;
        cur.push_back(nums[i]);
        dfs(nums, pos + 1, result, cur);
        cur.pop_back();
        Visited[i] = false;
    }
}

vector<vector<int>> permuteUnique(vector<int>& nums) {
    vector<vector<int>> result;
    vector<int> cur;
    // 全排列去重的关键是排序过的集合
    sort(nums.begin(), nums.end());
    dfs(nums, 0, result, cur);
    return result;
}
posted @ 2023-05-20 14:54  linukey  阅读(82)  评论(0)    收藏  举报