1. 程式人生 > 實用技巧 >leetcode刷題-39組合總和

leetcode刷題-39組合總和

題目

給定一個無重複元素的陣列candidates和一個目標數target,找出candidates中所有可以使數字和為target的組合。

candidates中的數字可以無限制重複被選取。

思路

這道題採用遍歷的方式效率太低,因此可以想到回溯的方式。

演算法:

1.對candidates進行排序

2.回溯函式combination:索引i,當前陣列tmp,下一目標target:

  2.1 當target == 0時,滿足條件,tmp新增進入result

  2.2 剪枝當索引等於candidates長度的時候,已經結束,return;當target <candidates[i]的時候,後續也不存在滿足的結果,因此剪枝,return。

  2.3 重複呼叫自身

  2.4 呼叫下一個元素

實現

class Solution:
    def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:
        if(not candidates):
            return []
        n=len(candidates)
        result=[]
        candidates.sort()

        def combination(idx, tmp, target):
            
if target == 0 : result.append(tmp) return if idx == n or target < candidates[idx]: return combination(idx, tmp+[candidates[idx]],target-candidates[idx]) combination(idx+1, tmp, target) combination(0,[],target)
return result