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], ]» Solve this problem
class Solution {
private:
void search(vector<vector<int> > &ans, vector<int> & temp, int n, int last, int step, int k) {
if (step == k) {
ans.push_back(temp);
return;
}
for (int i = last + 1; i <= n; i++) {
temp.push_back(i);
search(ans, temp, n, i, step + 1, k);
temp.pop_back();
}
}
public:
vector<vector<int> > combine(int n, int k) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
vector<vector<int> > ans;
vector<int> temp;
search(ans, temp, n, 0, 0, k);
return ans;
}
};
public class Solution {
public void search(int n, int k, int last, int step, ArrayList<ArrayList<Integer>> answer, ArrayList<Integer> cur) {
if (step == k) {
answer.add(cur);
return;
}
for (int i = last + 1; i <= n; i++) {
ArrayList<Integer> temp = new ArrayList<Integer>(cur);
temp.add(i);
search(n, k, i, step + 1, answer, temp);
}
}
public ArrayList<ArrayList<Integer>> combine(int n, int k) {
// Note: The Solution object is instantiated only once and is reused by each test case.
ArrayList<ArrayList<Integer>> answer = new ArrayList<ArrayList<Integer>>();
search(n, k, 0, 0, answer, new ArrayList<Integer>());
return answer;
}
}