地址:https://leetcode.com/problems/combinations/
题目:
Given two integers n and k, return all possible combinations of k numbers out of 1 … n.
Example:
理解:
很像前面的permutation还有combinatio sum的问题,用backtracking解决。
实现:
感觉自己仿佛失了智,多用了一个nums
数组,然而begin就可以代替了。
class Solution {
public:
vector<vector<int>> combine(int n, int k) {
vector<int> nums(n);
for(int i=0;i<n;++i)
nums[i]=i+1;
vector<vector<int>> res;
vector<int> tmp;
backtracking(nums,k,res,tmp,0);
return res;
}
void backtracking(vector<int>& nums,int k,vector<vector<int>>& res, vector<int>& tmp, int begin){
if(tmp.size()==k){
res.push_back(tmp);
return;
}
for(int i=begin;i<nums.size();++i){
tmp.push_back(nums[i]);
backtracking(nums,k,res,tmp,i+1);
tmp.pop_back();
}
}
};
修改一下:
class Solution {
public:
vector<vector<int>> combine(int n, int k) {
vector<vector<int>> res;
vector<int> tmp;
backtracking(res, tmp, n, k, 1);
return res;
}
private:
void backtracking(vector<vector<int>>& res, vector<int>& tmp, int n, int k, int begin) {
if (tmp.size() == k) {
res.push_back(tmp);
return;
}
for (int i = begin; i <= n; ++i) {
tmp.push_back(i);
backtracking(res, tmp, n, k, i + 1);
tmp.pop_back();
}
}
};
上面第二种实现先后跑出了76ms和48ms?