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