LeetCode刷题DAY 37:组合总合
时间:2022-07-25
本文章向大家介绍LeetCode刷题DAY 37:组合总合,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
1
题目描述
给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使和为 target 的组合。candidates 中的数字可以无限制重复被选取。
2
回溯算法
回溯算法的基本思想是:从一条路往前走,能进则进,不能进则退回来,换一条路再试,是一种类似枚举的搜索方式。比如现在要从A走到B,当从A->B->D时发现没有办法走到B,则要退回C,从C->E,再从E->B。
3
题解
本题结合回溯算法的思想,我们首先遍历一个点a,然后计算能否从剩余的点中找到和为target-a的点。结合上述例子看一下计算过程:
- step 1:首先遍历第一个点2,arget变为5。因为5不等于0,所以需要继续向下,直至target变为-1。
- step 2:因为此时target<0,因此我们回到上一层的2并减去下一个值,即3,此时target=0,满足条件,该路径是目标路径之一。
- step 3:因为此处减3target已经变为0,则无需继续遍历比3大的值。此时回到上一层,继续减后面的值。
- step 4:同理,重复上述过程,直至所以情况全部遍历一遍,最终形成的树状图如下。
- step 5:注意上面树状图标识出的两条路径,结果是一样的,因此我们在加入路径中的点时,不要重复加入前面的点(如上一步减掉3,下一步就不要减掉3前面的2,而是从3后面的6开始减)。
class Solution:
def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:
if not candidates:
return []
#建立递归函数,进行回溯遍历
def back(target,index,tmp):
#两个结束遍历条件
if target == 0:
path.append(tmp[::])
return
if target < 0:
return
#从当前的index后面加入点,避免重复
for i in range(index,len(candidates)):
tmp.append(candidates[i])
target -= candidates[i]
back(target,i,tmp)
#把当前层前一个点剔除,好在下一次循环中加入下一个点
tmp.pop()
target += candidates[i]
tmp = []
path = []
back(target,0,tmp)
return path
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 这一次搞懂Spring代理创建及AOP链式调用过程
- 这一次搞懂Spring事务注解的解析
- 这一次搞懂Spring事务是如何传播的
- 这一次搞懂SpringMVC原理
- 这一次搞懂Spring Web零xml配置原理以及父子容器关系
- 这一次搞懂SpringBoot核心原理(自动配置、事件驱动、Condition)
- 全网最深分析SpringBoot MVC自动配置失效的原因
- Mybatis源码初探——优雅精良的骨架
- 深入Mybatis源码——配置解析
- 深入Mybatis源码——执行流程
- Mybatis插件扩展以及与Spring整合原理
- 你所不知道的Spring的@Autowired实现细节
- modbus-RTU-crc16——c语言
- KEIL 生成 Binaxf 文件
- Istio可观测性