leetcode subset ||

本文介绍了一种在存在重复元素的情况下生成子集的方法。通过排序和递归深度优先搜索(DFS)策略,确保生成的子集不包含重复项。文章详细解释了如何跟踪重复元素并适当地将它们添加到当前子集中。

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

此题与 subset | 相比,给定的数组中存在重复的元素,为了避免子集中出现重复,在DFS过程中需要判断具体情况

具体思路参考http://www.cnblogs.com/TenosDoIt/p/3451902.html

代码

class Solution {
public:
 vector<vector<int> > subsetsWithDup(vector<int> &S) {

 vector<vector<int> > res;
 vector<int> tempSubset;
 sort(S.begin(), S.end());
 subsetHelper(res, tempSubset, 0, S);
 return res;
 }

 void subsetHelper(vector<vector<int> > &res, vector<int> tempSubset, int iEnd, vector<int> S)
 {
 if(iEnd==S.size())
 {
 res.push_back(tempSubset);
 return;
 }

 int firstSameNum = iEnd;

	//对于某一元素,若其重复,则找到在原数组中该元素第一个出现的位置
while(firstSameNum>=0&&S[firstSameNum]==S[iEnd]) firstSameNum--;

 //减‘一’是为了去除当前元素
int sameCnt = iEnd - firstSameNum-1;

	//若该元素在已遍历的数组中没有重复元素 或者 有重复元素且在tempSubset中该重复元素的个数即为到目前为止遍历原来的数组S时重复出现该元素的个数
//此时即将该元素加入tempSubset
 if(sameCnt==0||sameCnt<=tempSubset.size()&&tempSubset[tempSubset.size()-sameCnt]==S[iEnd])
 {
 tempSubset.push_back(S[iEnd]);
 subsetHelper(res, tempSubset, iEnd+1, S);
 tempSubset.pop_back();
 }

 subsetHelper(res, tempSubset, iEnd+1, S);

 }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值