leetcode刷题-40组合总和2
2024-09-28 12:19:25
题目
给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
candidates 中的每个数字在每个组合中只能使用一次。
思路
此题思路与39题类似,利用回溯的方式,但是难点在于不能重复利用。
避免重复要让同一层级不出现相同的元素,却允许了不同层级之间的重复相同元素:
1
/ \
2 2 这种情况不会发生
/ \
5 5
1
/
2 这种情况确是允许的
/
2
因此在剪枝时,需要将重复的元素删除。
算法:
1.对candidates进行排序
2.回溯函数combination:索引i,当前数组tmp,下一目标target:
2.1 当target == 0时,满足条件,tmp添加进入result
2.2 剪枝 当索引等于candidates长度的时候,已经结束,return;当target < candidates[i]的时候,后续也不存在满足的结果,因此剪枝,return。
2.3 调用后续元素(不允许重复),在j遍历区间[i,n)中:
2.3.1 剪枝 当j>idx 且candidates[j]==candidates[j-1]时,会调用重复的元素,将其删除
2.3.2 调用下一元素
实现
class Solution:
def combinationSum2(self, candidates: List[int], target: int) -> List[List[int]]:
if(not candidates):
return []
n=len(candidates)
result=[]
candidates.sort() def combination(idx, tmp, target):
print(idx, tmp, target)
if target == 0 :
result.append(tmp)
return
if idx == n or target < candidates[idx]:
return
for j in range(idx, n):
if j>idx and candidates[j]==candidates[j-1]:
continue
combination(j+1, tmp+[candidates[j]],target-candidates[j]) combination(0,[],target)
return result
最新文章
- txt文本变成html
- HDU 1051 Wooden Sticks
- android 在线升级借助开源中国App源码
- php之aop实践
- 牛人整理分享的面试知识:操作系统、计算机网络、设计模式、Linux编程,数据结构总结 转载
- 【重要】ASCII码表
- iOS App Launch Option
- ###STL学习--标准模板库
- Hibernate4 clob字段存取
- 为人们服务的asp.net 验证控件
- linux命令之crontab详解
- Parse Fatal Error at line 41 column 24: 元素类型 ";url-pattern"; 必须由匹配的结束标记 ";<;/url-pattern>;"; 终止
- JAXB注解的使用详解
- runAllManagedModulesForAllRequests
- vue文档全局api笔记2
- codeforces433B
- 图解http pdf
- sql查询与修改数据库逻辑文件名,移动数据库存储路径
- 怎么用Python写爬虫抓取网页数据
- android面试(4)---文件存储