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

被折叠的 条评论
为什么被折叠?



