当前位置:网站首页>Leetcode刷题——路径总和
Leetcode刷题——路径总和
2022-08-04 11:06:00 【lonelyMangoo】
概述
记录了112. 路径总和、 113. 路径总和 II、437. 路径总和 III。
都是用递归完成的,里面有一些细节,还是通过递归思路进行分析。
112. 路径总和
题目:112. 路径总和
这里有特定的条件,就是根节点到叶子结点。所以只需要看到到叶子结点的时候,目标值是否已经剪为0。
直接从代码分析
//为什么有返回值这里递归可以用返回值?还是之前那说的,因为要用到返回值。
//为什么这里可以把参数写到方法体中?因为在整个方法体中,要的就是当前的targetSum,并不会受前后的影响。
public boolean hasPathSum(TreeNode root, int targetSum) {
//终止条件
if(root == null) return false;
//函数体,当前该节点到叶子结点还需要的大小。
targetSum-=root.val;
//找到了对应的值,终止条件
if(root.left ==null && root.right == null){
return targetSum == 0;
}
//左右子树右一个对的即可,这里用到了返回值。
return hasPathSum(root.left,targetSum) || hasPathSum(root.right,targetSum);
}

113. 路径总和 II
题目:113. 路径总和 II
这题和之前不一样的地方是需要找到所有的路径。
那么就需要用一个list来保存。听起来和之前差不多,但是与很多需要注意的地方,在代码中详细说明。
//为什么放在递归的方法体外面而不放在里面,因为每次都要求是最新的
private List<List<Integer>> res = new ArrayList<>();
List<Integer> list =new ArrayList<>();
public List<List<Integer>> pathSum(TreeNode root, int targetSum) {
find(root,targetSum);
return res;
}
//为什么没有返回值,因为不需要用,这里需要的是递归找到所有的结果,并不需要对返回值进行处理。
private void find(TreeNode root, int targetSum ){
if(root == null){
return;
}
//将当前节点算入其中。
list.add(root.val);
targetSum-=root.val;
if(root.left ==null && root.right == null){
if( targetSum == 0){
//这里一定要new !!!
//否则存的是一个引用
res.add(new ArrayList(list));
}
}
find(root.left,targetSum);
find(root.right,targetSum);
//当前节点处理过了,就把它移除。
list.remove(list.size()-1);
}

437. 路径总和 III
题目:437. 路径总和 III
这道题去掉了根节点和叶子结点的条件,顺延上面的思路,只需要把每个节点都可以作为叶子节点和根节点就可以了。但是其实中间出过一个问题,就是会出现重复情况。
比如:
如果目标节点是4的话,1-2 会到4
但是从1分出来那个分支也就是直接从2开始也会到达4,4就被计数了两次。
直接上代码进行分析
int sum = 0;
public int pathSum(TreeNode root, int targetSum) {
judge(root,targetSum,true);
return sum;
}
//两个参数放在方法体上,因为是一个局部的,并不是全局的。
public void judge(TreeNode root, long count, boolean isStartNode) {
if (root == null) {
return;
}
if (count == root.val) {
sum++;
}
//这里是头节点,如果true才能继续
//防止多次当头的情况发生
//这样递归的话,每个点都有的当头的机会。
if (isStartNode ){
judge(root.left, count, true);
judge(root.right, count, true);
}
//头节点确定的时候,往下搜索。
//下面的节点都不是头节点,不需要走上面这个判断逻辑。isStartNode设置为false
if (root.left != null) {
judge(root.left, count-root.val, false);
}
if (root.right != null) {
judge(root.right, count-root.val, false);
}
}

边栏推荐
- 华为云安全云脑,让企业云化运营更放心
- 小程序容器加快一体化在线政务服务平台建设
- CVPR 2022 | 从人体网格预测骨架,是真正的生理学骨架!
- RL78 development environment
- Redis查询缓存
- ORA-00054 资源正忙
- ECCV 2022 | 清华&腾讯AI Lab提出REALY: 重新思考3D人脸重建的评估方法
- 热成像测温的原理是什么呢?你知道吗?
- Graphic and text hands-on tutorial--ESP32 MQTT docking EMQX local server (VSCODE+ESP-IDF)
- Jina 实例秀|基于神经搜索的网络安全威胁检测(一)
猜你喜欢

中介者模式(Mediator)

JUC(1)线程和进程、并发和并行、线程的状态、lock锁、生产者和消费者问题

Learn to use the basic interface of set and map

深度强化学习与APS的一些感想

【Idea系列】idea配置

ECCV 2022 | 清华&腾讯AI Lab提出REALY: 重新思考3D人脸重建的评估方法

C#/VB.NET:在 Word 中设置文本对齐方式

数据化管理洞悉零售及电子商务运营——零售密码

【LeetCode】653. 两数之和 IV - 输入 BST

图文手把手教程--ESP32 MQTT对接EMQX本地服务器(VSCODE+ESP-IDF)
随机推荐
A topic of map
临床研究方法学,到现场,到数据真实发生的地方 | 对话数智 x 张维拓
MySQL最大建议行数2000w, 靠谱吗?
Advanced transcriptome analysis and R data visualization hot registration (2022.10)
What is the terminal privilege management
【Inspirational】The importance of review
少即是多:视觉SLAM的点稀疏化(IROS 2022)
2万字50张图玩转Flink面试体系
【LeetCode】98.验证二叉搜索树
【机器学习】:如何对你的数据进行分类?
萌宠来袭,如何让“吸猫撸狗”更有保障?
Graphical Hands-on Tutorial--ESP32 One-Key Network Configuration (Smartconfig, Airkiss)
使用.NET简单实现一个Redis的高性能克隆版(二)
入门MySql表的增删查改
Google Earth Engine APP ——制作上传GIF动图并添加全球矢量位置
zabbix deployment
Camunda overall architecture and related concepts
【Idea series】idea configuration
onlyoffice设置跟踪变化trackChanges默认为对自己启动
Super Learning Method