Subsets Description:
Given a set of distinct integers, 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,3]
, a solution is:
[ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], [] ]
分析: 首先注意集合内的元素都是不同的整数,所以尽情产生就好了。产生subsets时,基本思想是由小到大,先产生小的,再
利用小的产生大集合。具体来说,就是先用0个,1个,...来生成子集然后对新的元素,只要把前面的所有子集中加上个新元素,然后和之前
的子集和在一起,就是所有子集了。这里能直接加元素,就是因为没有重复的整数
1 class Solution { 2 public: 3 vector<vector<int> > subsets(vector<int> &S) { 4 sort(S.begin(),S.end()); 5 vector<vector<int> > result; 6 7 vector<int> comb; 8 result.push_back(comb); 9 10 for(int i=0;i<S.size();i++) 11 { 12 int nows = result.size(); 13 for(int j=0;j<nows;++j) 14 { 15 comb = result[j]; 16 comb.push_back(S[i]); 17 result.push_back(comb); 18 } 19 } 20 21 return result; 22 } 23 };
SubsetsII Description:
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], [] ]
分析:这个题目和上面的唯一区别就在于集合中有相同的元素, 然后再遇到后面是相同元素的时候,添加到子集中产生新子集时,相当于要选择往里面添加几个这个元素。
这里直接用跟上面一样的方法,只是再最后把它们放到set中,去除重复元素,然后再放回vector中返回。这种方法好像有点萌蠢。。 但是呢,根据上面的分析,还有一种
做法,就是将vector中所有元素遍历一遍,放到map中,map中key就是元素值,value是重复的个数,然后就用这个map开始同样的过程,只是产生新的子集的时候
,根据value值,分别产生加不同数量的该元素。
class Solution { public: vector<vector<int> > subsetsWithDup(vector<int> &S) { sort(S.begin(),S.end()); set<vector<int> > setres; vector<vector<int> > results; vector<int> comb; results.push_back(comb); for(int i=0;i<S.size();i++) { int nows = results.size(); for(int j=0;j<nows;++j) { comb = results[j]; comb.push_back(S[i]); results.push_back(comb); } } setres.insert(results.begin(),results.end()); results.assign(setres.begin(),setres.end()); return results; } };