子集 II(dfsleetcode90)-------------------c++实现

这篇博客介绍了如何使用深度优先搜索(DFS)解决一个编程问题,即给定一个可能含有重复元素的整数数组,找出所有不重复的子集。作者通过C++实现了算法,并给出了详细的思路解析,包括将数组处理为不包含重复元素的新数组,以及在搜索过程中处理重复元素的方法。最终,博客展示了AC代码和示例输入输出。

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

子集 II(dfsleetcode90)-------------------c++实现

题目表述

给你一个整数数组 nums ,其中可能包含重复元素,请你返回该数组所有可能的子集(幂集)。

解集 不能 包含重复的子集。返回的解集中,子集可以按 任意顺序 排列。

样例

输入:nums = [1,2,2]
输出:[[],[1],[1,2],[1,2,2],[2],[2,2]]

条件

1 <= nums.length <= 10
-10 <= nums[i] <= 10

思路

记录没元素重复的个数,然后深搜的时候按重复的个数加入队列进行下一个搜索。

注意点

ac代码

c++:
class Solution {
public:
   
     void dfs(vector<int> &nums,vector<vector<int>> &result,vector<int> &now,int j,vector<int> &member)
      {
          for(int i=j+1;i<nums.size();i++)
          {
                   int x;
                    if(nums[i]<0)
                   x=-nums[i]+10;
                 else
                   x=nums[i];
                  for(int z=0;z<member[x];z++)
                  {
                      now.push_back(nums[i]);
                      dfs(nums,result,now,i,member);
                  }

              for(int z=0;z<member[x];z++)
              now.pop_back();
              }
          
          

          result.push_back(now);
      }

    vector<vector<int>> subsetsWithDup(vector<int>& nums) {
    vector<int> member(22,0);
     vector<vector<int>> result;
      vector<int> now;


      vector<int> nums1;
      for(int i=0;i<nums.size();i++)
      {
          if(nums[i]>=0)
          member[nums[i]]++;
          else
          member[-nums[i]+10]++;
      }                                  
      for(int i=0;i<11;i++)
      if(member[i])
    nums1.push_back(i);
       for(int i=11;i<21;i++)
      if(member[i])
      nums1.push_back(-(i-10));
                                //nums1存储新数组(不含重复数据),member存储每个数的个数
      for(int i=0;i<nums1.size();i++)
      {
                int x;
                    if(nums1[i]<0)
                   x=-nums1[i]+10;
                 else
                   x=nums1[i];
                  for(int z=0;z<member[x];z++)  //看nums1[i]存在了几次
                  {
                      now.push_back(nums1[i]);
                      dfs(nums1,result,now,i,member);
                  }

              for(int z=0;z<member[x];z++)
              now.pop_back();
      }
      result.push_back(now);
      return result;
    }
};

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/squares-of-a-sorted-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值