day25
又做出来题目了!!夸!
思路和之前差不多,无非就是求个和,不过我这里求和做复杂了。还多用了个循环。其实可以在下面的循环中就可以求。
我剪枝也没想到。。。。。。。
一个是没想到 和大于了之后可以直接剪,
二刷的心得:
终止条件的时候,如果是path.size() == k && sum == n 这样的话,
就需要多加一个终止条件 sum > n return
因为上面两个条件有可能不能同时满足,所以需要多加一个判断。
如果分开写,先判断path.size() == k,再判断sum == n,就没事。因为第一个必定会被满足。
if( sum > n)
return;
二一个是 对上一题 77 题的组合,剪枝理解得不够深入!
i <= 9 + 1 - (k - path.size())
这里 i 的取值都是意味着一个区间的最左边!如图:
class Solution {
public:
vector<int> path;
vector<vector<int>> res;
void backtracking(int k, int n,int startIndex)
{
int sum = 0;
for(int a : path)
{
sum += a;
}
if(sum > n) // 剪枝
return;
if(sum == n && path.size() == k)
{
res.push_back(path);
return ;
}
for(int i = startIndex; i <= 9 + 1 - (k - path.size()) ; i++ ) // 可以如何剪枝呢?
{
path.push_back(i);
backtracking(k ,n ,i + 1);
path.pop_back();
}
return;
}
vector<vector<int>> combinationSum3(int k, int n) {
backtracking(k , n ,1);
return res;
}
};
再来一遍看题解之后的修改!
class Solution {
public:
vector<int> path;
vector<vector<int>> res;
int sum;
void backtracking(int k, int n, int startIndex)
{
if( sum > n)
return;
if(sum == n && path.size() == k)
{
res.push_back(path);
return;
}
for(int i = startIndex; i <= 9 + 1 - (k - path.size()); i++)
{
sum += i; // 放在这里循环里面求和
path.push_back(i);
backtracking(k , n , i + 1);
sum -= i;
path.pop_back();
}
return;
}
vector<vector<int>> combinationSum3(int k, int n) {
backtracking(k , n ,1);
return res;
}
};