1. 程式人生 > >LeetCode 39. 組合總和(Combination Sum)

LeetCode 39. 組合總和(Combination Sum)

gin -s ati div span i++ 不能 ida 思路

題目描述

給定一個無重復元素的數組 candidates 和一個目標數 target ,找出 candidates 中所有可以使數字和為 target 的組合。

candidates 中的數字可以無限制重復被選取。

說明:

  • 所有數字(包括 target)都是正整數。
  • 解集不能包含重復的組合。

示例 1:

輸入: candidates = [2,3,6,7], target = 7,
所求解集為:
[
  [7],
  [2,2,3]
]

示例 2:

輸入: candidates = [2,3,5], target = 8,
所求解集為:
[
  [2,2,2,2],
  [2,3,3],
  [3,5]
]

解題思路

考慮用回溯法解題。首先將數組從小到大排序,然後從第一個數字開始遍歷,若該數字不大於當前目標值,則將其加入到結果數組中,然後把目標值減去當前數字,並從當前數字開始向後遞歸尋找下一個滿足上述條件的數字。若到某一步為止目標值為0,則將當前結果數組加入到集合中。每個數字向後遍歷完之後,將其從結果數組中去除,從下一個數字開始繼續尋找,直到走到數組末尾或者沒有不大於目標值的數。

代碼

 1 class Solution {
 2 public:
 3     vector<vector<int>> combinationSum(vector<int
>& candidates, int target) { 4 sort(candidates.begin(),candidates.end()); 5 vector<vector<int>> res; 6 vector<int> temp; 7 if(candidates.size()) 8 combi(candidates,target,temp,res,0); 9 return res; 10 } 11 void combi(vector<int
>& candidates, int target, vector<int>& temp, vector<vector<int>>& res, int start){ 12 if(target==0) 13 res.push_back(temp); 14 else{ 15 int i=start; 16 while(i<candidates.size()&&candidates[i]<=target){ 17 temp.push_back(candidates[i]); 18 combi(candidates, target-candidates[i], temp, res, i); 19 temp.pop_back(); 20 i++; 21 } 22 } 23 } 24 };

LeetCode 39. 組合總和(Combination Sum)