代码随想录算法训练营第二十七天 | 39. 组合总和、40. 组合总和 II、131. 分割回文串
39. 组合总和
题目链接:39. 组合总和
- Java里面push和add别乱用
- startIndex从i开始了
- 排序剪枝
40. 组合总和 II (20min)
题目链接:40. 组合总和 II
-
排序去重
-
树层去重和树枝去重不同
-
使用标记数组去重和操作startIndex跳过树层相同的数
class Solution { public: vector<vector<int>> res; vector<int> path; vector<bool> visited; vector<vector<int>> combinationSum2(vector<int>& candidates, int target) { visited.resize(candidates.size(), false); sort(candidates.begin(), candidates.end()); backTrack(candidates, target, 0, 0); return res; } void backTrack (vector<int>& candidates, int target, int curSum, int startIndex) { // if(curSum > target) return; if(curSum == target) { res.push_back(path); return; } for(int i = startIndex; i < candidates.size(); i++) { // if (i >= 1 && i != startIndex && && candidates[i] == candidates[i - 1]) if(i >= 1 && !visited[i - 1] && candidates[i] == candidates[i - 1]) { // 这里是对树层上的重复元素去掉,但是造成了误伤,所以需要 i != startIndex这个条件 continue; } if(curSum + candidates[i] > target) break; visited[i] = true; curSum += candidates[i]; path.push_back(candidates[i]); backTrack(candidates, target, curSum, i + 1); curSum -= candidates[i]; path.pop_back(); visited[i] = false; } } };
131. 分割回文串
题目链接:131. 分割回文串
- startIndex 到 i 是子串的范围
- for循环控制切割的位置,递归控制切割的次数
- 这题需要多看几遍