leetcode刷題-39組合總和
阿新 • • 發佈:2020-08-02
題目
給定一個無重複元素的陣列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