LeetCode数组篇47之回溯法求全排列去重

47. 全排列 II

难度中等

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

emmm上一篇还在说数组标记法不好用,这一篇就打脸了,这里不能使用数组交换法,因为交换导致判断是否重复这一环节会出问题,目前还没想到解决办法,所以乖乖用数组标记法啦,先对nums进行排序,方便后面判断是否用过,好难理解,但还是勉强扒拉出来了

上代码

class Solution {
public:
    vector<int> path;
    vector<vector<int>> res;
    int flag[8];
    void swap(int &a,int &b){
        int t;
        t=a;
        a=b;
        b=t;
    }
    void dfs(vector<int>& nums,int i,int len){
        if(i==len){
            res.push_back(path);
            return ;
        }
        for(int j=0;j<len;j++){
            if(flag[j])
                continue;
            if(!flag[j] && j>0 && nums[j]==nums[j-1] && flag[j-1])
                continue;
            flag[j]=1;
            path.push_back(nums[j]);
            dfs(nums,i+1,len);
            flag[j]=0;
            path.pop_back();
        }
    }
    vector<vector<int>> permuteUnique(vector<int>& nums) {
        int len=nums.size();
        sort(nums.begin(),nums.end());
        if(!len){
            return res;
        }
        dfs(nums,0,len);
        return res;
    }
};

结果:

 2023年7月22日,我刷了三道题,怎么这么难哇,似理解非理解的,快卒了,洗洗睡😭😭😭

本宫睡不着,看了评论区,鲜红的“云贵人虽愚蠢,却实在美丽”,不是交换法不行啊,是我无能啊,我copy了一下别人的代码,记录在这以后慢慢消化。

 太难受了,真的不看了,while(true)cout<<"😭";

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值