leetcode90:子集II

90. 子集 II - 力扣(LeetCode) (leetcode-cn.com)

这里的数据范围比较小,所以可以直接用暴搜,利用st[N]数组记录第i个数是否被选中1为选0为不选,因为可能存在重复的情况,所以我们得将子集排列并用unordered_map消重。

具体代码如下;

const int N=11;

vector<vector<int>> ans(1);

class Solution {
public:

    int st[N];
    
    unordered_map<string,int> ha;

    void dfs(vector<int> a,int c,int max){

        if(c==max){

            vector<int> mid;
            string jud;//将答案映射成字符串,用于unordered_map制作key

            for(int i=0;i<max;i++){

                if(st[i]){

                    mid.push_back(a[i]);
                    jud+=a[i]+'0';

                }
            }
            sort(jud.begin(),jud.end());
            if(!ha.count(jud)) 
                ans.push_back(mid),ha[jud]=1;
            return;
        }

        st[c]=1;//选
        dfs(a,c+1,max);
        st[c]=0;//不选
        dfs(a,c+1,max);

        return ;

    }

    vector<vector<int>> subsetsWithDup(vector<int>& nums) {

           ha.clear();
           ans.clear();
           

           dfs(nums,0,nums.size());

           return ans;
          
    }
};

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值