LeetCode题目记录
第40题:组合总和II
1.题目链接
[https://leetcode-cn.com/problems/combination-sum-ii/]
2.题目内容
给定一个数组 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]
]
3.解题思路
本题对数组进行求和,并且数组中元素只可使用一次:
(1)参见[https://blog.csdn.net/weixin_41725746/article/details/89344783]
4.代码实现
class Solution:
def combinationSum2(self, candidates: List[int], target: int) -> List[List[int]]:
candidates.sort()
n = len(candidates)
if n == 0:
return []
if candidates[0] > target:
return []
re = []
for i in range(n):
nu=candidates[i+1:] # 数组中元素在求和时只用一次
temp=target-candidates[i]
res=[candidates[i]]
if temp == 0:
re.append(res) # 一旦多个元素的值等于target,则输出这个值,并只输出一次。
break # 与组合求和I相比,多出来这个步骤,防止元素重复输出。
elif temp<0:
break
else:
a=self.combinationSum2(nu,temp)
for k in a:
k=res+k # 将target减掉的res再与生成的k连接
if k not in re:
re.append(k) # 去除重复项
return re