LeetCode每日1题--路径总和

78 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第1天,点击查看活动详情

前言

算法的重要性不言而喻!区分度高!

现在学习的门槛低了,只有能上网每个人都可以学编程!培训班6个月就可以培养出来能干活的人,你怎么从这些人中脱颖而出?没错!就是学算法,学一些底层和基础的东西。

说的功利点是为了竞争,卷死对手。真心话说就是能提高自己的基础能力,为技术可持续发展做好充分的准备!!!

提前入门学习书籍:CPrimerPlus、大话数据结构

image-20220705103735001

刷题网站

代码随想录 (programmercarl.com)

leetcode

我是按照代码随想录提供的刷题顺序进行刷题的,大家也可以去刷leetcode最热200道,都可以

刷题嘛,最重要的就是坚持了!!!

画图软件

OneNote

这个要经常用,遇见不懂的流程的话就拿它画一画!

笔记软件

Typoral

题目

image.png

解析

这题就是典型的DFS(深度优先遍历)

DFS的重点就是递归和回溯!

深度优先搜索的步骤分为

  1. 递归下去
  2. 回溯上来

先一条路走到底,直到达到目标。这里称之为递归下去。

没有达到目标又无路可走了,那么则退回到上一步的状态,走其他路。这便是回溯上来。

没错,这就是DFS,就是这么简单!

递归三部曲

  1. 确定递归的参数和返回值

这里只需要判断路径之和是否等于target,所以返回值为boolean,参数自然为根节点和目标值target。

判断路径之和这里使用的是用target减去递归路径中的节点的值,如果到达叶子结点了最后的值为0,说明这条路径就是满足题目要求的,否则返回false。

public boolean haspathsum(treenode root, int targetsum) {}
  1. 确定递归终止的条件 如果节点为空,那么直接返回false
if (root == null) { return false; }
  1. 确定单层递归的逻辑 单层递归的逻辑很简单,就是拿tagetNum - 递归路上的节点的值。如果最后结果为0,那就证明满足题目要求
return hasPathSum(root.left,targetSum - root.val)||hasPathSum(root.right,targetSum - root.val);

一图胜千言

image.png

完整代码

class solution {
    public boolean haspathsum(treenode root, int targetsum) {
        
        if (root == null) return false; // 为空退出
        
        // 叶子节点判断是否符合
        if (root.left == null && root.right == null) return root.val == targetsum;

        // 求两侧分支的路径和
        return haspathsum(root.left, targetsum - root.val) || haspathsum(root.right, targetsum - root.val);
    }
}