代码随想录算法训练营第二十七天 | 39. 组合总和、40. 组合总和 II、131. 分割回文串

53 阅读1分钟

代码随想录算法训练营第二十七天 | 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循环控制切割的位置,递归控制切割的次数
  • 这题需要多看几遍