代码随想录算法训练营第36期DAY29

DAY29

39组合总和

  1. class Solution {
  2. private:
  3.     vector<vector<int>> result;
  4.     vector<int>path;
  5.     void backtracking(vector<int> candidates,int target,int sum,int startindex){
  6.         if(sum>target) return;
  7.         if(sum==target){
  8.             result.push_back(path);
  9.             return ;
  10.         }
  11.         for(int i=startindex;i<candidates.size();i++)
  12.         {
  13.             path.push_back(candidates[i]);
  14.             sum+=candidates[i];
  15.             backtracking(candidates,target,sum,i);
  16.             sum-=candidates[i];
  17.             path.pop_back();
  18.         }
  19.         return ;
  20.     }
  21. public:
  22.     vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
  23.         result.clear();
  24.         path.clear();
  25.         backtracking(candidates,target,0,0);
  26.         return result;
  27.     }
  28. };

40组合总和ii

记住used数组:记录同一分支上的是否用过。语言表述见代码随想录网站。

  1. class Solution {
  2. private:
  3.     vector<vector<int>> result;
  4.     vector<int> path;
  5.     void backtracking(vector<int>& candidates,int target,int sum,int startindex,vector<bool>&used){
  6.         if(sum>target) return;
  7.         if(sum==target){
  8.             result.push_back(path);
  9.             return ;
  10.         }
  11.         for(int i=startindex;i<candidates.size()&&sum+candidates[i]<=target;i++){
  12.             if(i>0&&candidates[i]==candidates[i-1]&&used[i-1]==falsecontinue;
  13.             used[i]=true;
  14.             path.push_back(candidates[i]);
  15.             sum+=candidates[i];
  16.             backtracking(candidates,target,sum,i+1,used);
  17.             used[i]=false;
  18.             path.pop_back();
  19.             sum-=candidates[i];
  20.         }
  21.         return ;
  22.     }
  23. public:
  24.     vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
  25.         result.clear();
  26.         path.clear();
  27.         vector<boolused(candidates.size(),false);
  28.         sort(candidates.begin(),candidates.end());
  29.         backtracking(candidates,target,0,0,used);
  30.         return result;
  31.     }
  32. };

131分割回文串

记:回溯组合题,答案要在叶子节点上,这样来构造

  1. class Solution {
  2. private:
  3.     bool ishuiwen(string s){
  4.         for(int i=0,j=s.size()-1;i<j;i++,j--){
  5.             if(s[i]!=s[j]) return false;
  6.         }
  7.         return true;
  8.     }
  9.     vector<vector<string>> result;
  10.     vector<string> path;
  11.     void backtracking(string s,int startindex){
  12.         if(startindex>=s.size()) {
  13.             result.push_back(path);
  14.             return ;
  15.         }
  16.         for(int i=startindex;i<s.size();i++){
  17.             string tmpstr=s.substr(startindex,i-startindex+1);
  18.             if(!ishuiwen(tmpstr)) continue;
  19.             path.push_back(tmpstr);
  20.             backtracking(s,i+1);
  21.             path.pop_back();
  22.         }
  23.         return;
  24.     }
  25. public:
  26.     vector<vector<string>> partition(string s) {
  27.         result.clear();
  28.         path.clear();
  29.         backtracking(s,0);
  30.         return result;
  31.     }
  32. };

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值