难度中等
给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。
解析:
对于一个包含全部长度为n的子集的集合,其实只要输出原集合中所有升序排列可能便不会重复且不会遗漏,而这个集合刚好可以由长度为n-1子集的集合生成,由于元素不会重复,所以可以直接按元素大小作为序列,对nums排序后(后来发现数据都是默认升序排序的,优化掉sort以后可以到80%).可以从n=0开始生成到n=nums.size(),这些就是所有的子集.
#include<iostream>
#include<vector>
#include<algorithm>
using std::vector;
class Solution {
public:
vector<vector<int>> subsets(vector<int>& nums) {
vector<vector<int> > rel;
rel.push_back(vector<int>());
vector<vector<int> > st;
//std::sort(nums.begin(),nums.end());
for(int i=1;i<=nums.size();i++)
{
vector<vector<int> > ed;
if(st.empty())
{
for(int k : nums)
{
vector<int> ft;
ft.push_back(k);
ed.push_back(ft);
}
}
else
{
for(auto s : st)
{
int fnum=*s.rbegin();
for(auto n : nums)
{
if(n>fnum)
{
vector<int> p(s);
p.push_back(n);
ed.push_back(p);
}
}
}
}
for(auto g : ed)
{
rel.push_back(g);
}
std::swap(st,ed);//原来写的是赋值st=ed,优化之后提升了30%的速度
}
return rel;
}
};