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;
}
相关文章推荐
- permutations
- caffe中如何可视化cnn各层的输出
- 思科路由器的VXR的含义
- laravel眼瞎么?
- pmpi简单实例
- Android 正确的闪屏方式。
- 5. Longest Palindromic Substring
- 信息管理代码分析<一>登录密码
- laravel遇到的问题
- 利用caffe pre-trained model进行图像分类
- 2016-03-31 书籍列表
- HDU1298 T9
- JAVA面试题4
- 经典排序算法(Java版)
- MySQL Command 常见命令
- 20070929迅雷面试部分题
- 华为的JAVA面试题及答案(部分)
- hdu 2521(反素数)
- 【Leetcode】Reverse Words in a String II
- 2009年浙江大学计算机及软件工程研究生机试真题