全排列II

给定一个可包含重复数字的序列 nums按任意顺序 返回所有不重复的全排列。

思路

  1. 首先考虑,在什么情况下出现的重复?

    [1,1,2]为例,分别选了第1个1第二个1为开头时,会出现重复结果

  2. 解决方法是: 如果不选某个元素,那么和这个元素相等的后续元素也应该跳过

    即,如果选了第一个1,那么后续的1就可以选

    ​ 如果不选第一个1,那么后续的1也不能选

代码

class Solution {
public:
    vector<vector<int>> ans;
    vector<int> res;
    
    vector<vector<int>> permuteUnique(vector<int>& nums) {
        // 去重需要排序
        sort(nums.begin(), nums.end());
        res.resize(nums.size());
        dfs(0, 0, nums);
        return ans;
    }

    void dfs(int depth, int state, vector<int>& nums)
    {
        int n = nums.size();
        if(depth == n)
        {
            ans.push_back(res);
            return;
        }
        
        for(int i = 0; i < n; i++)
        {
            if(!(state >> i & 1))
            {
                // 如果当前元素和上一个位置元素相等,且上一个元素没有被选,那就应该跳过
                if(i && nums[i] == nums[i - 1] && !(state >> i - 1 & 1)) continue;
                res[depth] = nums[i];
                dfs(depth + 1, state + (1 << i), nums);
            }
        }
    }
};
posted @ 2022-11-15 19:02  INnoVation-V2  阅读(16)  评论(0编辑  收藏  举报