LeetCode39:Combination Sum(回溯)
阿新 • • 發佈:2018-11-29
Given a set of candidate numbers (candidates
) (without duplicates) and a target number (target
), find all unique combinations in candidates
where the candidate numbers sums to target
.
The same repeated number may be chosen from candidates
unlimited number of times.
Note:
- All numbers (including
target
) will be positive integers. - The solution set must not contain duplicate combinations.
Example 1:
Input: candidates =[2,3,6,7],
target =7
, A solution set is: [ [7], [2,2,3] ]
Example 2:
Input: candidates = [2,3,5],
target = 8, A solution set is:[ [2,2,2,2], [2,3,3], [3,5] ]
LeetCode:連結
回溯法習題:
LeetCode40:Combination Sum II(回溯)
LeetCode216:Combination Sum III(回溯)
LeetCode377:Combination Sum IV(動態規劃)
讓你判斷有多少種呢就是動態規劃,一旦讓我們寫出全部的組合那就是回溯。
回溯就是一直加進去數,滿足條件就存下來,不滿足呢就回退一步。
注意backtracking函式,利用for可以實現回溯。我們對陣列進行了排序,所以for中一旦target<candidates[i],那麼就代表著這個陣列已經不可能和是target了 ,一定要設定break跳出這個迴圈,否則會一直進行下去,永無天日的!如果不排序,就要判斷target<0,判斷時間就會比較長!
class Solution(object):
def combinationSum(self, candidates, target):
"""
:type candidates: List[int]
:type target: int
:rtype: List[List[int]]
"""
ans, res = [], []
candidates.sort()
self.backtracking(candidates, target, 0, ans, res)
return res
def backtracking(self, candidates, target, start, ans, res):
if target == 0:
res.append(ans)
else:
for i in range(start, len(candidates)):
if target < candidates[i]:
break
self.backtracking(candidates, target-candidates[i], i, ans+[candidates[i]], res)