1. 程式人生 > >LeetCode39:Combination Sum(回溯)

LeetCode39:Combination Sum(回溯)

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)