Subsets
Given a set of distinct integers, nums, 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 nums = [1,2,3]
, a solution is:
[ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], [] ]
题意:求子集
解题思路: 前两种方法参考实验室小伙伴(师妹)博文, 网址 http://blog.csdn.net/lmy690858904/article/details/45717327 感谢一块儿学习共同进步的小伙伴们 第三种方法 结合了组合数的思想
方法一: 用二进制01串表示当前数组状态
class Solution { public: vector<vector<int> > subsets(vector<int> &S) { // IMPORTANT: Please reset any member data you declared, as // the same Solution instance will be reused for each test case. // 2**n = c(n, 0) + c(n, 1) + c(n, 3) + ... + c(n, n) sort(S.begin(), S.end()); vector<vector<int> > v2; vector<int> v; v2.push_back(v); //0 int n = S.size(); int m = 1 << n; for(int i = 1; i < m - 1; i++){ vector<int> v1; int t = i; for(int j = 0; j < n; j++){ if(t & 1){ v1.push_back(S[j]); } t >>= 1; if(t == 0) break; } v2.push_back(v1); } v2.push_back(S); return v2; } };
方法二: 由空集不断扩展
class Solution { public: vector<vector<int> > subsets(vector<int> &S) { // IMPORTANT: Please reset any member data you declared, as // the same Solution instance will be reused for each test case. // 2**n = c(n, 0) + c(n, 1) + c(n, 3) + ... + c(n, n) sort(S.begin(), S.end()); vector<vector<int> > v2; v2.push_back(vector<int>()); //0 int n = S.size(); for(int i = 0; i < n; i++){ int curSize = v2.size(); for(int j = 0; j < curSize; j++){ vector<int> v(v2[j]); v.push_back(S[i]); v2.push_back(v); } } return v2; } };
方法三: 组合数
class Solution { public: void combineRecursion(vector<int> &S, vector<vector<int> > &vvi, vector<int> &vi, int b, int n, int k) { // IMPORTANT: Please reset any member data you declared, as // the same Solution instance will be reused for each test case. if(0 == k){ vvi.push_back(vi); return; } for(int i = b; i <= n - k + 1; i++){ vi.push_back(S[i - 1]); int tmpb = i + 1; int tmpk = k - 1; combineRecursion(S, vvi, vi, tmpb, n, tmpk); vi.pop_back(); } } vector<vector<int> > subsets(vector<int> &S) { // IMPORTANT: Please reset any member data you declared, as // the same Solution instance will be reused for each test case. // 2**n = c(n, 0) + c(n, 1) + c(n, 3) + ... + c(n, n) vector<vector<int> > vvi; vector<int> tvi; vvi.push_back(tvi); sort(S.begin(), S.end()); long int n = S.size(); int k; for(int i = 1; i <= n; i++){ vector<int> vi; combineRecursion(S, vvi, vi, 1, n, i); } return vvi; } };