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],
[]
]
Solution: 1. Recursive solution.
2. Iterative solution. Contributed by
yinlinglin.
1 class Solution {
2 public:
3
4 vector<vector<int> > subsets(vector<int> &S) {
5 vector<vector<int> > res;
6 sort(S.begin(), S.end());
7 vector<int> set;
8 int N = S.size();
9 for(int i = 0; i <= N; i++) {
10 subsets(S, 0, i, set, res);
11 }
12 return res;
13 }
14
15 void subsets(vector<int> &S, int start, int length, vector<int> &set, vector<vector<int> > &res) {
16 if(set.size() == length) {
17 res.push_back(set);
18 return;
19 }
20 int N = S.size(), M = set.size();
21 for(int i = start; i < N - (length-M) + 1; i++) {
22 set.push_back(S[i]);
23 subsets(S, i+1, length, set, res);
24 set.pop_back();
25 }
26 }
27 };
10. 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],
[]
]
1 class Solution {
2 public:
3 vector<vector<int> > subsetsWithDup(vector<int> &S) {
4 vector<vector<int> > res;
5 vector<int> set;
6 int N = S.size();
7 sort(S.begin(), S.end());
8 res.push_back(vector<int>());
9 for(int i = 1; i <= N; i++) {
10 subsetsWithDupRe(S, 0, i, set, res);
11 }
12 return res;
13 }
14
15 void subsetsWithDupRe(vector<int> &S, int start, int length, vector<int> &set, vector<vector<int> > &res)
16 {
17 int N = S.size(), M = set.size();
18 if(M == length) {
19 res.push_back(set);
20 return;
21 }
22 for(int i = start; i < N - (length-M) + 1; i++) {
23 if(i > start && S[i] == S[i-1]) continue;// duplicate
24 set.push_back(S[i]);
25 subsetsWithDupRe(S, i+1, length, set, res);
26 set.pop_back();
27 }
28
29 }
30 };
原文:http://www.cnblogs.com/zhengjiankang/p/3646370.html