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], ]题意:给出n和k,输出1-n之间的长度为k的组合。
思路:递归。中间进行了数组的复制,beats 3.57%
class Solution {
public:
vector<vector<int>> combine(int n, int k) {
vector<int> tmp;
vector<vector<int>> res;
recursion(n, k, tmp, res);
return res;
}
void recursion(int n, int k, vector<int> tmp, vector<vector<int>>&res){
if (tmp.size() == k){
res.push_back(tmp);
return;
}
if (tmp.empty()){
for (int i = 1; i <= n; i++){
vector<int> myvec;
myvec.push_back(i);
recursion(n, k, myvec, res);
}
}
else{
int begin = tmp[tmp.size() - 1];
for (int i = begin + 1; i <= n; i++){
vector<int> myvec(tmp);
myvec.push_back(i);
recursion(n, k, myvec, res);
}
}
}
};
思路2:回溯,beats: 27.43%
class Solution {
public:
vector<vector<int>> combine(int n, int k) {
vector<int> tmp;
vector<vector<int>> res;
recursion(n, k, tmp, res);
return res;
}
void recursion(int n, int k, vector<int>& tmp, vector<vector<int>>&res){
if (tmp.size() == k){
res.push_back(tmp);
return;
}
if (tmp.empty()){
for (int i = 1; i <= n; i++){
tmp.push_back(i);
recursion(n, k, tmp, res);
tmp.pop_back();
}
}
else{
int begin = tmp[tmp.size() - 1];
for (int i = begin + 1; i <= n; i++){
tmp.push_back(i);
recursion(n, k, tmp, res);
tmp.pop_back();
}
}
}
};
思路3:更好的剪枝处理,beats: 79.80%
class Solution {
public:
vector<vector<int>> combine(int n, int k) {
vector<int> tmp;
vector<vector<int>> res;
recursion(n, k, tmp, res);
return res;
}
void recursion(int n, int k, vector<int>& tmp, vector<vector<int>>&res){
if (tmp.size() == k){
res.push_back(tmp);
return;
}
if (tmp.empty()){
for (int i = 1; i <= n-k+1; i++){
tmp.push_back(i);
recursion(n, k, tmp, res);
tmp.pop_back();
}
}
else{
int begin = tmp[tmp.size() - 1];
for (int i = begin + 1; i <= n-(k-tmp.size())+1; i++){
tmp.push_back(i);
recursion(n, k, tmp, res);
tmp.pop_back();
}
}
}
};