您的位置:首页 > 其它

subsets

2016-04-01 06:01 435 查看
 

subsets:

给出一组数组,列出所有可能的子集

对于n个元素,有2^n个子集

对于此题构造一个bool类型的向量select

每个元素可以选也可以不选

Subsets II

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],

[]

]

 

分析

这题有重复元素,但本质上,跟上一题很类似,上一题中元素没有重复,相当于每个元素只能
选0 或1 次,这里扩充到了每个元素可以选0 到若干次而已。

#include <iostream>
#include <vector>
#include<algorithm>

using namespace std;

class Solution
{
public:
//subsets II
vector<vector<int>> subsetII(vector<int>&S)
{
sort(S.begin(), S.end());//排序

vector<vector<int>>result(1);//包含一个空子集
int previous_size = 0;
for (int i = 0; i < S.size(); i++)
{
int size = result.size();//判断现有的result有几个元素
for (int j = 0; j < size; j++)
{
if (i == 0 || S[i] != S[i - 1] || j >= previous_size)//判断有没有重复元素
{
result.push_back(result[j]);
result.back().push_back(S[i]);//back()返回尾元素的引用
}
}
previous_size = size;
}
return result;

}

//subset
vector<vector<int>> Subset(vector<int> &Arr)
{
sort(Arr.begin(),Arr.end());
vector<vector<int>>result;
vector<bool>select(Arr.size(), false );

subset(Arr, select, 0, result);
return result;
}
private:
void subset(vector<int>&Arr, vector<bool>&select, int step, vector<vector<int>>&result)
{
if (step == Arr.size())
{
vector<int>subset;
for (int i = 0; i < Arr.size(); i++)
{
if (select[i])
subset.push_back(Arr[i]);
}
result.push_back(subset);
return;
}

//不选select[step]
select[step] = false;
subset(Arr, select, step + 1, result);//每个select都有Arr.size()元素,可能其中是空
//选select[step]
select[step] = true;
subset(Arr, select, step + 1, result);

}
};

int main()
{
Solution s1;
int n;
vector<vector<int>>result;
vector<int>vec;
cout << "请输入n:";
cin >> n;
for (int i = 0; i <n; i++)
{
vec.push_back(i + 1);
}
result = s1.Subset(vec);
cout << "输出结果:" << endl;
for (int i = 0; i < result.size(); i++)
{
for (int j = 0; j < result[i].size(); j++)
{
cout << result[i][j] << ",";
}
cout << endl;
}
system("pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: