Combinations:
Given two integers n and k,
return all possible combinations of k numbers out of 1 ... n.
For example,
If n = 4 and k =
2, a solution is:
[ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ]
#define vi vector<int> #define vvi vector<vi > #define pb push_back class Solution { public: vector<vector<int> > combine(int n, int k) { // Start typing your C/C++ solution below // DO NOT write int main() function vvi ret; vi had; solve(1,n,k,ret,had); return ret; } void solve(int c,int n,int k,vvi& ret,vi& had) { if ( k<=0||c>n ) { if (k==0) ret.pb(had); return; } had.pb(c); solve(c+1,n,k-1,ret,had); had.pop_back(); solve(c+1,n,k,ret,had); } };
Subsets:
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], [] ]
#define vi vector<int> #define vvi vector<vi > #define pb push_back #define viter vi::iterator class Solution { public: vector<vector<int> > subsets(vector<int> &S) { // Start typing your C/C++ solution below // DO NOT write int main() function sort(S.begin(),S.end()); viter r= unique(S.begin(),S.end()); viter l=S.begin(); vvi ret; vi had; solve(l,r,ret,had); return ret; } void solve(viter l,viter r,vvi& ret,vi& had) { if ( l==r ) { ret.pb(had); return; } viter t=l++; solve(l,r,ret,had); had.pb(*t); solve(l,r,ret,had); had.pop_back(); } };
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], [] ]
剪掉重复结果的思路同Combination Sum II 一样。
#define vi vector<int> #define vvi vector<vi > class Solution { public: vector<vector<int> > subsetsWithDup(vector<int> &S) { // Start typing your C/C++ solution below // DO NOT write int main() function int n=S.size(); vi had; vvi ans; sort(S.begin(),S.end()); solve(0,S,had,ans,0); return ans; } void solve(int k,vi& S, vi& had,vvi& ans, int used) { int n=S.size(); if ( k>=n ) { ans.push_back(had); return; } solve(k+1,S,had,ans,0); if ( k==0 || S[k]!=S[k-1] || used==1 ) { had.push_back(S[k]); solve(k+1,S,had,ans,1); had.pop_back(); } } };