leetcode 39. 組合總和(python)


給定一個無重復元素的數組 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]
]

class Solution:
    def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:
        self.res = []
        if len(candidates) <= 0:
            return res
        candidates.sort()
        self.dfs(candidates,[],target,0)  # 遞歸回溯
        return self.res
            
    def dfs(self,candidates,sublist,target,last):  # last表示當前sublist的最后一個元素
        if target == 0:
            self.res.append(sublist) 
        if target < candidates[0]:  # 剪枝操作,目標值小於擁有的最小元素
            return 
        for num in candidates:  # 數字可重復使用,則每次從頭遍歷
            if num > target:  # 剪枝操作,當當前數值大於目標值,則后續無需遍歷
                return 
            if num < last: # 剪枝操作:若當前數值小於當前sublist的最后一個元素,則繼續遍歷,防止出現重復解決方案,如[2,2,3],[3,2,2]
                continue
            self.dfs(candidates,sublist+[num],target-num,num)

參考: https://blog.csdn.net/weixin_40546602/article/details/88357837 

遞歸函數 dfs(candidates,sublist,target,last),其中sublist記錄當前滿足條件的子數組,last為當前子數組的最后一個元素。

剪枝操作1:目標值小於元素數組的最小元素,則無需繼續遍歷

剪枝操作2:當前元素大於目標值,則后續元素一定大於目標值(數組已排序),不會滿足條件,無需繼續遍歷

剪枝操作3:若當前數值小於當前sublist的最后一個元素,則繼續遍歷,防止出現重復解決方案,如[2,2,3],[3,2,2]


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM