1. 程式人生 > >Leetcode:39. 陣列總和

Leetcode:39. 陣列總和

給定一個無重複元素的陣列 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]
]

解題思路:

DFS,一共三個變化量,分別是當前的target值,當前的訪問位置pos,以及之前的訪問資料road。

1. 先對陣列排序。

2. DFS可以訪問所有組合,只訪問pos及其之後的資料,可以避免重複。

3. 每次訪問一個數據,將資料寫入road,target都要相應減小,直到為0,將road儲存到res,很顯然res是個全域性變數(相對class Solution)。

4. 優化。pos位置的值如果大於target,那麼後續都不必訪問。

111
更多細節
C++程式碼
class Solution { public:     vector<vector<int>> combinationSum(vector<int>& candidates, int target) {         sort(candidates.begin(), candidates.end());         data = candidates;         vector<int> road;//儲存訪問過的值,初始值為空         DFS(0, target, road);         return res;     }     void DFS(int pos, int target, vector<int> road) {         if (target == 0) { res.push_back(road); return; }         for (int i = pos; i<int(data.size()); i++) {             if (data[i] > target) return;             target -= data[i];             road.push_back(data[i]);             DFS(i, target, road);             road.erase(road.end() - 1);             target += data[i];         }     } private:     vector<int> data;     vector<vector<int>> res; };