LeetCode 40. 組合總和 II
阿新 • • 發佈:2018-12-17
給定一個數組 candidates
和一個目標數 target
,找出 candidates
中所有可以使數字和為 target
的組合。
candidates
中的每個數字在每個組合中只能使用一次。
說明:
- 所有數字(包括目標數)都是正整數。
- 解集不能包含重複的組合。
示例 1: 輸入: candidates = [10,1,2,7,6,1,5], target = 8, 所求解集為: [ [1, 7], [1, 2, 5], [2, 6], [1, 1, 6] ] 示例 2: 輸入: candidates = [2,5,2,1,2], target = 5, 所求解集為: [ [1,2,2], [5] ]
演算法
基本思路同39. 組合總和。區別就在於判斷一些相同數字的使用次數。
程式碼
class Solution: def combinationSum2(self, candidates, target): """ :type candidates: List[int] :type target: int :rtype: List[List[int]] """ import collections dst = collections.Counter(candidates) candidates = list(dst.keys()) candidates.sort() def back(lst, tg, res): for i in range(len(lst)): j = 1 while j <= dst[lst[i]]: if tg - j * lst[i] == 0: yield res + j * [lst[i]] if tg - j * lst[i] > 0: yield from back(lst[(i + 1):], tg - j * lst[i], res + j * [lst[i]]) if tg - j * lst[i] < 0: break j += 1 return list(back(candidates, target, []))