給定乙個包含無重複元素的陣列candidates和乙個目標數target,找出 candidates 中所有可以使數字和為 target 的組合。candidates 中的數字可以無限制重複被選取。
vectorint>> res;
void
dfs(
int depth,
int target, vector<
int> nums, vector<
int> candidates)
if(depth >= candidates.
size()
|| target <0)
for(
int i =
0; i * candidates[depth]
<= target; i++
)dfs
(depth +
1, target - candidates[depth]
* i, nums, candidates)
;for
(int j =
0; j < i; j++)}
}vectorint>>
combinationsum
(vector<
int>
& candidates,
int target)
我最初採用這個寫法來做,在考慮到candidate[depth]將其所有可能出現的情況都通過乙個for迴圈產生,這樣寫的時間和空間都比較差,但是也能通過,後來參考了乙個網上的寫法。
vector<
int> nums;
vectorint>> res;
void
dfs(
int i, vector<
int> candidates,
int target)
for(
; i < candidates.
size()
; i++
)else}}
vectorint>>
combinationsum
(vector<
int>
& candidates,
int target)
我的想法與這個演算法相同,只是他在每一層dfs搜尋的時候只會放入乙個元素,但是時間和空間佔比就會小的很多,本來以為是由於排序的原因,因為排序會將很多大的數字放在後面,這樣可以最大化的利用target個人猜測是由於我的那種寫法對nums的修改是通過for迴圈一次完成,而這種寫法是迭代式的增加的,所以更為節約時間,另外他將nums作為了全域性變數,這樣在遞迴呼叫的時候也會節約一些棧上的空間。
這兩種實現,演算法本質上是相同的,但是因為一些細節問題,導致時間相差比較大。
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...