Leetcode篇:組合總和
阿新 • • 發佈:2018-11-15
@author: ZZQ
@software: PyCharm
@file: combinationSum.py
@time: 2018/11/14 18:23
要求:給定一個無重複元素的陣列 candidates 和一個目標數 target ,找出 candidates 中所有可以使數字和為 target 的組合。
candidates 中的數字可以無限制重複被選取。
說明:
所有數字(包括 target)都是正整數。
解集不能包含重複的組合。
示例 1:
輸入: candidates = [2,3,6,7], target = 7,
所求解集為:
[
[7],
[2,2,3]
]
示例 2: 輸入: candidates = [2,3,5], target = 8, 所求解集為: [ [2,2,2,2], [2,3,3], [3,5] ]
思路:深搜+減枝
注意停止搜尋:當和大於target時,結束該條支路的搜尋。
注意去重:先對陣列排好序,每次都處理當前元素以後的元素。
注意: 存入ans時需要將臨時陣列拷貝出來,否則ans中的答案會因為temp_ans的改變而一直改變。
import copy class Solution(): def __init__(self): pass def combinationSum(self, candidates, target): """ :type candidates: List[int] :type target: int :rtype: List[List[int]] """ candidates.sort() can_len = len(candidates) if can_len == 0: return [] ans = [] temp_ans = [] temp_sum = 0 start_index = 0 self.dfs(temp_ans, temp_sum, start_index, target, candidates, ans) return ans def dfs(self, temp_ans, temp_sum, start_index, target, candidates, ans): if temp_sum == target: tt_ans = copy.deepcopy(temp_ans) ans.append(tt_ans) return if temp_sum > target: return for i in range(start_index, len(candidates)): temp_ans.append(candidates[i]) self.dfs(temp_ans, temp_sum + candidates[i], i, target, candidates, ans) temp_ans.pop()