一. 這題一開始想肯定回溯法, 一開始想了個順其自然的思路,直接看**能理解,結果重複了.
//沒有去重,報錯
class solution
if (sum == target)
for (int i = 0; i < candidates.size(); i++)
} vector>combinationsum(vector& candidates, int target)
};
二. 參考大神非常好的講解, 感覺這篇寫的回溯非常不錯.
1. 重複的原因每次backtrace裡的for迴圈都從i=0開始,導致第一次的1,2和第二次的2,1重複(仔細理解一下,大概這個意思).
2. 解決辦法大神的意思是設定乙個start變數, i每次從start開始,這樣不會出現1,2和2,1 這種情況,而是1,2和2,2這種情況.
//大神解法,用start變數限制只能找當前及其以後的元素
三. 參考大神的動態規劃,因為大神說"隨著我把組合總和的ii、iii、iv做完,尤其是到iv的時候,回溯演算法就超時了,而iv恰好是用動態規劃解決的,於是我就思考:能不能用動態規劃
求解本題."
1.總結:求解乙個值,需要求解上乙個值,進而需要求解上上個值...,這種方法就是動態規劃。重複的值只需要進行一次,而後再使用到這個值時,只需要將他的結果拿來適當增加即可。
//動態規劃
// 由@pris_bupt提供
vector> combinationsum(vector& candidates, int target) );
else if (i > it)
for (auto ivec : dict[i - it])
vector>ans;
for (auto it : dict[target]) ans.push_back(it);
return ans;
}
LeetCode 39 組合總和
給定乙個無重複元素的陣列candidates和乙個目標數target,找出candidates中所有可以使數字和為target的組合。candidates中的數字可以無限制重複被選取。說明 示例 1 輸入 candidates 2,3,6,7 target 7,所求解集為 7 2,2,3 示例 2 ...
leetcode39 組合總和
參考 class solution if next num.size target num next 0 邊界條件 return 對於每個元素,有兩種處理方式,選當前元素或者不選當前元素 psol.push back num next 選當前元素 search num,next,psol,targe...
LeetCode39組合總和
給定乙個無重複元素的陣列 candidates 和乙個目標數 target 找出 candidates 中所有可以使數字和為 target 的組合。candidates 中的數字可以無限制重複被選取。說明 所有數字 包括 target 都是正整數。解集不能包含重複的組合。示例 1 輸入 candid...