编程语言
首页 > 编程语言> > LeetCode刷题之回溯算法组合总和问题

LeetCode刷题之回溯算法组合总和问题

作者:互联网

回溯算法之组合总和问题

求解在一个数组中,找出所有满足数字和为目标数的组合

1.同一个数组,组合可存在重复数字,组合也能重复

 class Solution {
 public:
     vector<vector<int>> result;
     vector<int> path;
  void backtracking(vector<int>& nums,int target, int sums, int startindex)
    {
         if(sums>target) return;
         if(sums == target)
        {
             result.push_back(path);
             return;
        }
         for(int i=startindex;i<nums.size()&&sums+nums[i]<=target;i++)
        {  
             path.push_back(nums[i]);
             sums+=nums[i];
             backtracking(nums,target,sums,i+1);
             sums-=nums[i];
             path.pop_back();          
        }
    }
     vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
             result.clear();
             path.clear();
             sort(candidates.begin(),candidates.end());
             backtracking(candidates,target,0,0);
             return result;}
 };

2.同一个数组,组合可存在重复数字,不能存在重复组合

 //方法一
 class Solution {
 public:
     vector<vector<int>> result;
     vector<int> path;
  void backtracking(vector<int>& nums,int target, int sums, int startindex)
    {
         if(sums>target) return;
         if(sums == target)
        {
             result.push_back(path);
             return;
        }
         for(int i=startindex;i<nums.size()&&sums+nums[i]<=target;i++)
        {  
             if(i-1>=startindex && nums[i]==nums[i-1])
            {continue;}
             path.push_back(nums[i]);
             sums+=nums[i];
             backtracking(nums,target,sums,i+1);
             sums-=nums[i];
             path.pop_back();          
        }
    }
     vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
             result.clear();
             path.clear();
             sort(candidates.begin(),candidates.end());
             backtracking(candidates,target,0,0);
             return result;}
 };
 ​
 //方法二
 class Solution {
 public:
     vector<vector<int>> result;
     vector<int> path;
     void backtracking(vector<int>& nums,int target, int sums, int startindex,vector<bool>&used)
    {
         if(sums>target) return;
         if(sums == target)
        {
             result.push_back(path);
             return;
        }
         for(int i=startindex;i<nums.size()&&sums+nums[i]<=target;i++)
        {  
             if(i>0&&nums[i]==nums[i-1]&&used[i-1]==false)
            {continue;}
             used[i]=true;
             path.push_back(nums[i]);
             sums+=nums[i];
             backtracking(nums,target,sums,i+1,used);
             used[i]=false;
             sums-=nums[i];
             path.pop_back();        
        }
    }
 ​
     vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
             vector<bool> used(candidates.size(),false);
             result.clear();
             path.clear();
             sort(candidates.begin(),candidates.end());
             backtracking(candidates,target,0,0,used);
             return result;
    }
 };

 

 

TRANSLATE with x English
Arabic Hebrew Polish
Bulgarian Hindi Portuguese
Catalan Hmong Daw Romanian
Chinese Simplified Hungarian Russian
Chinese Traditional Indonesian Slovak
Czech Italian Slovenian
Danish Japanese Spanish
Dutch Klingon Swedish
English Korean Thai
Estonian Latvian Turkish
Finnish Lithuanian Ukrainian
French Malay Urdu
German Maltese Vietnamese
Greek Norwegian Welsh
Haitian Creole Persian  
  TRANSLATE with COPY THE URL BELOW Back EMBED THE SNIPPET BELOW IN YOUR SITE Enable collaborative features and customize widget: Bing Webmaster Portal Back     此页面的语言为中文(简体)   翻译为          

标签:target,nums,int,sums,vector,回溯,path,LeetCode,刷题
来源: https://www.cnblogs.com/haipengwu/p/16103023.html