给定一个可能包含重复的整数的集合,S返回所有可能的子集。

这是一个关于LeetCode上的问题,探讨如何使用回溯法来找到一个包含重复整数的集合的所有可能子集。文章引用了一位大神的回溯法思路链接,并指出传统方法可能导致内存超时。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本题源自LeetCode

--------------------------------------------------------------------------------------

大神的回溯法思路:http://blog.youkuaiyun.com/versencoder/article/details/52071930

回溯法求解

1 传统的 内存超时:

    vector<vector<int> > subsetsWithDup(vector<int> &S) {
        vector<vector<int>> result;
        sort(S.begin(),S.end());
        vector<int> list;
        backTracing(S,0,result,list);
        return result;
    }
    void backTracing(vector<int>& num,int start,vector<vector<int>>& result,vector<int>& list){
        result.push_back(list);
        
        for(int i=start;i<num.size();i++){
            
            if(i>start&&num[i]==num[i-1])
                continue;
            list.push_back(num[i]);
            backTracing(num,start+1,result,list);
            list.pop_back();
        }
    }

2  内存小。

  vector<vector<int>> res;
    vector<int> tmp;
    vector<vector<int> > subsetsWithDup(vector<int> &S) {
        sort(S.begin(),S.end());
        dp(0,0,S);
        return res;
    }
    void dp(int start,int n,vector<int> &num){
        if(tmp.size()==n){
            res.push_back(tmp);
            if(n<num.size()) dp(start,n+1,num);
            else
                return ;
        }
        for(int i=start;i<num.size();i++){
            if(i>start&&num[i]==num[i-1])
                continue;
            tmp.push_back(num[i]);
            dp(i+1,n,num);
            tmp.pop_back();
        }
    }



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值