今天天气有点闷,不是很适合外出,所以还是好好刷题吧!下面就和大家分享一下刚刷的这道题。
题目如下:
Find all possible combinations of k numbers that add up to a number n, given that only numbers from 1 to 9 can be used and each combination should be a unique set of numbers.
Note:
All numbers will be positive integers.
The solution set must not contain duplicate combinations.
Example 1:
Input: k = 3, n = 7
Output: [[1,2,4]]
Example 2:
Input: k = 3, n = 9
Output: [[1,2,6], [1,3,5], [2,3,4]]
题意分析:
给定两个数n与k,请找到k个数(从1到9中取)之和为n的所有组合。
注:
① 所有被给定的值均为正整数
② 最后返回的结果中不包括重复的组合
③ 同一组合中一个元素只能用一次
方法一(递归回溯法①)
与"https://blog.csdn.net/Vensmallzeng/article/details/96566470"方法一的思路几乎一样,不过这里是变相的给定了候选集为[1,2,3,...,9]而已。
解题代码如下:
class Solution{
public:
vector<vector<int>> combinationSum3(int k, int n){
vector<vector<int>> res;
if(k==0 || n==0) return res;
vector<int> temp;
FindcombinationSum3(k, n, 1, temp, res);
return res;
}
void FindcombinationSu m3(int k, int n, int start, vector<int>& temp, vector<vector<int>>& res){
if(n<0) return;
if(n==0 && temp.size()==k){
res.push_back(temp);
return;
}
for (int i = start; i <= 9; ++i) {
temp.push_back(i);
FindcombinationSum3(k, n-i, i+1, temp, res);
temp.pop_back();
}
}
};
提交后的结果如下:
方法二(优化方法一)
对方法一进行剪枝操作,将for循环中的控制条件改成:i <= 9-(k-temp.size())+1即可。
解题代码如下:
class Solution{
public:
vector<vector<int>> combinationSum3(int k, int n){
vector<vector<int>> res;
if(k==0 || n==0) return res;
vector<int> temp;
FindcombinationSum3(k, n, 1, temp, res);
return res;
}
void FindcombinationSum3(int k, int n, int start, vector<int>& temp, vector<vector<int>>& res){
if(n<0) return;
if(n==0 && temp.size()==k){
res.push_back(temp);
return;
}
for (int i = start; i <= 9-(k-temp.size())+1; ++i) {
temp.push_back(i);
FindcombinationSum3(k, n-i, i+1, temp, res);
temp.pop_back();
}
}
};
提交后的结果如下:
日积月累,与君共进,增增小结,未完待续。