39. 组合总和
随想录文字讲解:代码随想录 (programmercarl.com)
随想录视频讲解:带你学透回溯算法-组合总和(对应「leetcode」力扣题目:39.组合总和)| 回溯法精讲!_哔哩哔哩_bilibili
状态:做出来了
常规组合的回溯做法,区别在于可以重复使用同一元素,所以递归时参数继续用当前的index值就行。同时返回条件不用对数目进行判断,只判断sum和就行。代码如下:
class Solution {
public:
vector<int> v;
vector<vector<int>> res;
int sum;
void progress(vector<int>& candidates, int target,int num)
{
if(sum==target)
{
res.push_back(v);
return;
}
if(sum>target) return;
for(int i=num;i<candidates.size();i++)
{
v.push_back(candidates[i]);
sum+=candidates[i];
progress(candidates,target,i);
sum-=v.back();
v.pop_back();
}
}
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
progress(candidates,target,0);
return res;
}
};
有一个剪枝操作,当sum大于target时,其for循环后续的值也会大于target,但还会继续把for遍历完,在for循环中改为
for (int i = startIndex; i < candidates.size() && sum + candidates[i] <= target; i++)
可以避免后续多余的遍历。
但是不能在我的代码的基础上直接添加,因为我的sum是全局变量,会浮动,而for循环中的sum使用时会用当前的值,所以用这个剪枝时应把sum当成参数。
40.组合总和II
随想录文字讲解:代码随想录 (programmercarl.com)
随想录视频讲解:回溯算法中的去重,树层去重树枝去重,你弄清楚了没?| LeetCode:40.组合总和II_哔哩哔哩_bilibili
状态:没做出来
去重去不明白,寄了。
具体看讲解就行,讲的很仔细,尤其是去重
131.分割回文串
随想录文字讲解:代码随想录 (programmercarl.com)
随想录视频讲解:带你学透回溯算法-分割回文串(对应力扣题目:131.分割回文串)| 回溯法精讲!_哔哩哔哩_bilibili
状态:不会
看讲解就行,写时的难点:
- 切割问题可以抽象为组合问题
- 如何模拟那些切割线
- 切割问题中递归如何终止
- 在递归循环中如何截取子串
- 如何判断回文