1. 程式人生 > >Leetcode篇:組合總和

Leetcode篇:組合總和


@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()