当前位置: 首页 > news >正文

【每日一题】路径总和 III

文章目录

  • 题目描述
  • 题解
    • 解法一
    • 解法二

在这里插入图片描述

题目描述


437. 路径总和 III
给定一个二叉树的根节点 root ,和一个整数 targetSum ,求该二叉树里节点值之和等于 targetSum 的 路径 的数目。

路径 不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。

示例 1:
在这里插入图片描述

输入:root = [10,5,-3,3,2,null,11,3,-2,null,1], targetSum = 8
输出:3
解释:和等于 8 的路径有 3 条,如图所示。
示例 2:
在这里插入图片描述

输入:root = [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum = 22
输出:3
在这里插入图片描述

题解

解法一


从每一个节点往下找,直到到叶子节点,记录count,其实这样会出现大量的重复计算,但是也能跑过。

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    int _sum;
    int path = 0;
    int INF = -0x3f3f3f3f;
//思路一:将当前头部作为跟进行计算,到叶子才停止,因为叶子节点可能是负值
    void GetSum(TreeNode* root,int cursum)
    {    
        if(root == nullptr) return;
        if(cursum < INF)//爆int
        return ;

        int tmp = cursum - root->val;
        if(tmp == 0)
        {
            path ++;//到0也继续往下找
            // if(root)
            // cout << root->val << endl;
        }
        GetSum(root->left, tmp);
        GetSum(root->right, tmp);
    }
    void PreOrder(TreeNode* root)
    {
        if(root == nullptr) return ;
        GetSum(root,_sum);
        PreOrder(root->left);
        PreOrder(root->right);
    }
    int pathSum(TreeNode* root, int targetSum) {
        _sum = targetSum;
        PreOrder(root);

        return path;
    }
};

解法二

由于解法一没有利用到前缀和 + 哈希表,所以出现了大量重复的计算。
解法二通过计算前缀和,维护当前的数组和,然后就可以从哈希表获得需要的连续路经总和。

但是需要注意,当该元素遍历完,需要把这个子路径的和从哈希表-1,因为后面遍历的节点看不到这个更新。
unordered_map<int,int> um= {{0,1}}是由于需要当遍历到当前元素刚好满足targetSum,此时需要的前缀是0,所以我们手动加上一个上去。

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    unordered_map<int,int> um= {{0,1}};//前缀和
    int pre = 0;
    int count = 0;
    int INF = 1e9;
    int pathSum(TreeNode* root, int targetSum) {
        if(!root) return 0;
        if(pre > INF) return 0;
        pre += root->val;
        auto it = um.find(pre - targetSum);
        if(it != um.end()) //找到了,就可以累计count 
        count += it->second;
        um[pre] ++ ;//维护当前的数组和
        //cout << pre << " " << um[pre] << " " << count   << endl;
        pathSum(root->left,targetSum);
        pathSum(root->right,targetSum);
        if(um.count(pre)) um[pre] --;//维护前缀和
        pre -= root->val;


        return count;
    }
};



end

  • 喜欢就收藏
  • 认同就点赞
  • 支持就关注
  • 疑问就评论

相关文章:

  • 【Vue】基础系列(三三)指令语法-事件及其修饰符,动态样式,v-model的用法,数据持久化存在本地localStorage
  • 01_JSON的理解
  • 3D感知技术(3)双目立体视觉测距
  • spring学习第二天_Spring Ioc(1)
  • 22-08-30 西安JUC(03) Callable接口、阻塞队列4套方法、ThreadPool线程池
  • React(8)-组件ref
  • 2022/8/30
  • picoCTF - Day 1 - Warm up
  • 前端面试题之组件
  • 自己动手写编译器:词法解析的系统化研究
  • 【程序员面试金典】01.02. 判定是否互为字符重排
  • go实现剑指offer
  • 【Go-Lua】Golang嵌入Lua代码——gopher-lua
  • yolov5+shufflenet轻量化目标检测
  • 【BurpSuite】插件开发学习之J2EEScan(上)-被动扫描
  • 「译」Node.js Streams 基础
  • AWS实战 - 利用IAM对S3做访问控制
  • electron原来这么简单----打包你的react、VUE桌面应用程序
  • iOS小技巧之UIImagePickerController实现头像选择
  • MySQL主从复制读写分离及奇怪的问题
  • node入门
  • Object.assign方法不能实现深复制
  • QQ浏览器x5内核的兼容性问题
  • React中的“虫洞”——Context
  • session共享问题解决方案
  • storm drpc实例
  • V4L2视频输入框架概述
  • Vue源码解析(二)Vue的双向绑定讲解及实现
  • 动态魔术使用DBMS_SQL
  • 警报:线上事故之CountDownLatch的威力
  • 说说动画卡顿的解决方案
  • 问:在指定的JSON数据中(最外层是数组)根据指定条件拿到匹配到的结果
  • 我看到的前端
  • [地铁译]使用SSD缓存应用数据——Moneta项目: 低成本优化的下一代EVCache ...
  • #pragma multi_compile #pragma shader_feature
  • $ is not function   和JQUERY 命名 冲突的解说 Jquer问题 (
  • (33)STM32——485实验笔记
  • (java)关于Thread的挂起和恢复
  • (Python) SOAP Web Service (HTTP POST)
  • (附源码)计算机毕业设计ssm高校《大学语文》课程作业在线管理系统
  • (论文阅读32/100)Flowing convnets for human pose estimation in videos
  • (欧拉)openEuler系统添加网卡文件配置流程、(欧拉)openEuler系统手动配置ipv6地址流程、(欧拉)openEuler系统网络管理说明
  • (区间dp) (经典例题) 石子合并
  • (十五)devops持续集成开发——jenkins流水线构建策略配置及触发器的使用
  • (转)程序员技术练级攻略
  • (转)如何上传第三方jar包至Maven私服让maven项目可以使用第三方jar包
  • .NET/ASP.NETMVC 深入剖析 Model元数据、HtmlHelper、自定义模板、模板的装饰者模式(二)...
  • .net6解除文件上传限制。Multipart body length limit 16384 exceeded
  • .net企业级架构实战之7——Spring.net整合Asp.net mvc
  • .NET应用架构设计:原则、模式与实践 目录预览
  • ::前边啥也没有
  • @EventListener注解使用说明
  • @TableLogic注解说明,以及对增删改查的影响
  • [ 云计算 | Azure 实践 ] 在 Azure 门户中创建 VM 虚拟机并进行验证
  • [Android Pro] Notification的使用