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], ]--------------------------------------------------------
combination, note that in this case, [1,2] and [2,1] are considered the same
we can use a stack instead of vector for vector<int> num
class Solution {
public:
void comb (vector<vector<int> >&ret, vector<int> num, vector<int> cur, int k) {
if (k == 0) {
ret.push_back(cur);
}else {
int size = num.size();
for (int i=0;i<size;i++) {
vector<int> temp = cur;
temp.push_back(num[0]);
num.erase(num.begin());
comb(ret,num,temp,k-1);
}
}
}
vector<vector<int> > combine(int n, int k) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
vector<int> num(n);
for (int i=0;i<n;i++) {
num[i] = 1+i;
}
vector<int> cur;
vector<vector<int> > ret;
comb(ret,num,cur,k);
return ret;
}
};
Update on Sep-16-2014 class Solution {
public:
void comb (vector<vector<int> > &rt, vector<int> cur, int n, int k, int index) {
if (k == 0) {
rt.push_back(cur);
return;
}
for (int i = index; i <= n + 1 - k; i++) {
vector<int> temp = cur;
temp.push_back(i);
comb(rt,temp,n,k - 1,i + 1);
}
}
vector<vector<int> > combine(int n, int k) {
vector<vector<int> > rt;
vector<int> v;
comb(rt,v,n,k,1);
return rt;
}
};
同subsets的bit operation的方法
class Solution {
public:
void helper(vector<vector<int>> &rt,vector<int> cur, int n, int k, int index) {
if (k == 0) {
rt.push_back(cur);
return;
}
if (k < 0 || index > n) return;
helper(rt,cur,n,k,index + 1);
cur.push_back(index);
helper(rt,cur,n,k - 1,index + 1);
}
vector<vector<int>> combine(int n, int k) {
vector<vector<int> > rt;
vector<int> cur;
helper(rt,cur,n,k,1);
return rt;
}
};
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.
If S =
[1,2,3], a solution is:[ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], [] ]--------------------------------------------------
Solution #1 recursive, Combination
class Solution {
public:
void sub (vector<vector<int> > &ret, vector<int> S, vector<int> cur) {
if (S.size() != 0) {
int size = S.size();
for (int i=0;i<size;i++) {
vector<int> temp = cur;
temp.push_back(S[0]);
S.erase(S.begin());
ret.push_back(temp);
sub(ret,S,temp);
}
}
}
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());
vector<vector<int> > ret;
vector<int> cur;
ret.push_back(cur);
sub(ret,S,cur);
return ret;
}
};
Update on Sep-17-2014 class Solution {
public:
void sub(vector<vector<int> > &rt, vector<int> cur, vector<int> S, int index) {
rt.push_back(cur);
for (int i = index; i < S.size(); i++) {
vector<int> temp = cur;
temp.push_back(S[i]);
sub(rt,temp,S,i + 1);
}
}
vector<vector<int> > subsets(vector<int> &S) {
sort(S.begin(),S.end());
vector<vector<int> > rt;
vector<int> v;
sub(rt,v,S,0);
return rt;
}
};
Update on Nov-01-2014 Solution #2, Bitmap
For each S it has 2^S.size() subsets and each for loop iteration generates one subset
1 2 3
------
0 0 0
0 0 1
0 1 0
0 1 1
...
class Solution {
public:
vector<vector<int> > subsets(vector<int> &S) {
int numOfSubsets = 1 << S.size();
sort(S.begin(),S.end());
vector<vector<int> > rt;
for (int i = 0; i < numOfSubsets; i++) {
int pos = 0;
int bitMask = i;
vector<int> sub;
while (bitMask > 0) {
if ((bitMask & 1) == 1) {
sub.push_back(S[pos]);
}
bitMask >>= 1;
pos++;
}
rt.push_back(sub);
}
return rt;
}
};
Update on Nov-18-2014
Solution #3 iterative
class Solution {
public:
vector<vector<int>> subsets(vector<int>& nums) {
vector<vector<int> > rt;
vector<int> cur;
rt.push_back(cur);
sort(nums.begin(),nums.end());
for (int i = 0; i < nums.size(); i++) {
vector<vector<int> > temp = rt;
for (int j = 0; j < temp.size(); j++) {
temp[j].push_back(nums[i]);
rt.push_back(temp[j]);
}
}
return rt;
}
};
Update on July-5th-2015
每个数字都可以为 “有” 或 “无”
class Solution {
public:
void helper(vector<vector<int> > &rt, vector<int> nums, vector<int> cur,int index) {
if (index == nums.size()) {
rt.push_back(cur);
return;
}
helper(rt,nums,cur,index + 1);
cur.push_back(nums[index]);
helper(rt,nums,cur,index + 1);
}
vector<vector<int>> subsets(vector<int>& nums) {
sort(nums.begin(),nums.end());
vector<vector<int> > rt;
vector<int> cur;
helper(rt,nums,cur,0);
return rt;
}
};
ToDo, 以上所有解法要再看一次