39. Combination Sum
題目網址:https://leetcode.cn/problems/combination-sum/
題意:給一無重複數的 array
candidates和一整數target, 找出candidates中可以使數字和等於target的所有不同組合, 以任意順序返回。其中,
candidates[i]皆> 0注意:
candidates同一個數字可以無限次重複選取, 如果至少一個數字的被選數量不同, 則兩種組合是不同的

Solution 1:
想法:利用 DFS + Backtracking, 其中每個元素
candidates[i]有兩種選擇:
選, 並從此位置
i繼續選要不要重複選取不選, 從下一個位置
i + 1的元素繼續開始
class Solution { |
- time:$O(n \cdot 2^n)$ ➔ 每個元素都有兩種選擇, 故最多有 $2^n$ 種選擇, 而每一種選擇皆需花 $O(n)$
- space:$O(target)$ ➔ worse case 下,
dfs()最大遞迴深度為 $O(target)$
Solution 2:
想法:同 Solution 1, 只是透過 pruning 來做優化, 一旦當前元素超過
target, 則直接跳過。for loop 中之所以沒有不取元素的部分, 是因為:
- 若取, 則會遞迴執行
dfs(j, target - candidates[j])- 若不取, 則在下一輪 for loop 中
dfs(j + 1, target)是不會有nums[j]的, 因為上一輪的cur有做 backtracking, 會將狀態還原回加入nums[j]前的狀態後, 才進到下一輪的j + 1
class Solution { |
- time:$O(n \cdot 2^n)$ ➔ worse case 仍為 $O(n \cdot 2^n)$, 透過使用 pruning, 實際運行情況應該是遠小於 $O(n \cdot 2^n)$ 的
- space:$O(target)$ ➔ worse case 下,
dfs()最大遞迴深度為 $O(target)$
本部落格所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 Zako's Blog!
評論
