LeetCode题解(python)
40. 组合总和 II
题目描述
给定一个数组 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]
]
解题心得
解答本题,我的第一想法是在昨天程序的基础上进行改动,区别在于每个数字只能使用一次,还是可以使用多次。
然后,由于晚上没吃饭,太累了,我没思考……,全靠蒙(敏感性),随便改了一个地方
findsum(temp_rel.copy(),tempsum,i+1)
,大致意思就是,既然之前i已经被搜索到了,下次就不要搜索了呗~(因为有下次的判断index = last(i+1); if i < index:...
以下算法执行用时 : 112 ms, 在Combination Sum II的Python3提交中击败了54.67% 的用户
解题代码
class Solution:
def combinationSum2(self, candidates: List[int], target: int) -> List[List[int]]:
rels = []
def findsum(rel,temp_sum,index):
for i,cd in enumerate(candidates):
if i < index:
#print(i,index)
continue
temp_rel = rel.copy()
temp_rel.append(cd)
tempsum = temp_sum+cd
if tempsum == target:
rels.append(temp_rel.copy())
return
elif tempsum < target:
findsum(temp_rel.copy(),tempsum,i+1)
else:
return
candidates = sorted(candidates)
findsum([],0,0)
rels2 = []
for i in rels:
if i not in rels2:
rels2.append(i)
return rels2