找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。
说明:
所有数字都是正整数。
解集不能包含重复的组合。
示例 1:
输入: k = 3, n = 7
输出: [[1,2,4]]
示例 2:
输入: k = 3, n = 9
输出: [[1,2,6], [1,3,5], [2,3,4]]
取消了vector数组拷贝,速度增加了,下面是执行情况。
执行结果:
通过
显示详情
执行用时 :0 ms, 在所有 C++ 提交中击败了100.00% 的用户
内存消耗 :9.2 MB, 在所有 C++ 提交中击败了8.68%的用户
#include <iostream>
#include <vector>
using namespace std;
class Solution {
public:
vector<vector<int>> combinationSum3(int k, int n) {
this->s_k = k;
vector<int> temp;
backtrace(temp,0,1,n);
return res;
}
/*
* temp : 结果集
* count: 计数看是否使用了k个数
* i : 边界值(1-9)
* n : 总和
*/
void backtrace(vector<int>& temp,
int count,
int i,
int n){
if(count==s_k && n==0){
res.push_back(temp);
return;
}
if(i>9){
return;
}
if(n-i>=0){
temp.push_back(i);
backtrace(temp,count+1,i+1,n-i);
temp.pop_back();
}
backtrace(temp,count,i+1,n);
}
private:
int s_k;
vector<vector<int>> res;
};
int main(){
Solution *ps = new Solution();
vector<vector<int>> res = ps->combinationSum3(3,9);
for(int i=0;i<res.size();i++){
for(int j=0;j<res[i].size();j++){
cout<<res[i][j];
}
cout<<endl;
}
return 0;
}