您的位置:首页 > 其它

LeetCode_Subsets II

2013-06-26 21:11 281 查看
Given a collection of integers that might contain duplicates, S, return all possible subsets.

Note:

Elements in a subset must be in non-descending order.

The solution set must not contain duplicate subsets.

For example,

If S =
[1,2,2]
,
a solution is:
[
[2],
[1],
[1,2,2],
[2,2],
[1,2],
[]
]

class Solution {
public:
void subsetsWithoutDup(vector<vector<int> > &ans, vector<int> &s)
{
vector<int> empty;
ans.push_back(empty);
int size = s.size();
if (size == 0)
{
return;
}
for (int i = 0; i < size; ++i)
{
int num = s[i];
int len = ans.size();
for (int j = 0; j < len; ++j)
{
vector<int> tmp = ans[j];
tmp.push_back(num);
ans.push_back(tmp);
}
}
}

vector<vector<int> > subsetsWithDup(vector<int> &s)
{
vector<vector<int> > ans;
if (s.size() == NULL)
{
return ans;
}
sort(s.begin(), s.end());
int size = s.size();
vector<int> dup;
int last = s[0];
int count = 1;
int i = 1;
for (; i < size; ++i)
{
if (s[i] == last)
{
++count;
--size;
--i;
s.erase(s.begin() + i);
}
else
{
if (count > 1)
{
dup.push_back(last);
dup.push_back(count);
--i;
s.erase(s.begin() + i);
--size;
}
last = s[i];
count = 1;
}
}
if (count > 1)
{
dup.push_back(last);
dup.push_back(count);
--i;
s.erase(s.begin() + i);
--size;
}
subsetsWithoutDup(ans, s);
int num = 0;
int total = dup.size();
while (num < total)
{
int size = ans.size();
int nNum = dup[num];
int nCount = dup[num + 1];
num += 2;
for (int i = 0; i < nCount; ++i)
{
int start = ans.size() - size;
int end = ans.size();
for (int j = start; j < end; ++j)
{
vector<int> tmp = ans[j];
tmp.push_back(nNum);
ans.push_back(tmp);
}
}
}
int ansNum = ans.size();
for (int i = 0; i < ansNum; ++i)
{
sort(ans[i].begin(), ans[i].end());
}
return ans;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: