力扣47. 全排列 II

这道题和全排列那道很像,只是这道题有重复元素而已。有重复元素的话,我们就要先排序,把重复的给集中到一起。之后我们做出本题的树形结构,辅助解题。

 我们知道,我们为了去重还是需要used数组,去重的逻辑就是

if(i>0&&num[i]==num[i-1]&&used[i-1]==false)
//我们需要知道,在这里的话used[i-1]==false是树层去重,就是左右方向
//而used[i-1]==true是树枝去重,就是上下方向

在本题当中树枝去重,树层去重都可以,我们选取树层去重,因为效率高。

为什么是等于false时是树层去重,我们可以认为回溯操作时,我们有操作used[i]=false,回溯之后,回溯到了上一层,所以我们认为false的时候是树层去重。

具体代码如下

vector<int>path;
vector<vector<int>>res;
void backtrack(vector<int>&num,vector<bool>&used)
{
    if(path.size()==num.size())
    {
        res.push_back(path);
        return ;
    }

    for(int i=0;i<num.size();i++)
    {
        if(i>0&&num[i]==num[[i-1]&&used[i-1]==false)continue;

        path.push_back(num[i]);
        used[i]=true;
        backtrack(num,used);
        used[i]=false;
        path.pop_back();
    }
}

vector<vector<int>> permuteUnique(vector<int>& nums) {
    vector<bool>used(nums.size(),false);
    sort(nums.begin(),nums.end());
    backtrack(nums,used);
    return res;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值