首页 > 其他分享 >leetcode:路径总和 III

leetcode:路径总和 III

时间:2023-04-13 22:37:25浏览次数:45  
标签:acc hashmap root 路径 leetcode 前缀 III 节点 总和

问题描述

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

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

示例1

image.png

输入: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

提示:

二叉树的节点个数的范围是 [0,1000]
-109 <= Node.val <= 109 
-1000 <= targetSum <= 1000 

题目地址:437. 路径总和 III

解题思路

这道题用到了一个概念,叫前缀和。就是到达当前元素的路径上,之前所有元素的和。

什么是 前缀和

前缀和怎么应用呢?在同一个路径之下(可以理解成二叉树从root节点出发,到叶子节点的某一条路径),如果两个数的前缀总和是相同的,那么这些节点之间的元素总和为零。

我们利用先序遍历二叉树,记录下根节点 root 到当前节点 pp 的路径上除当前节点以外所有节点的前缀和,在已保存的路径前缀和中查找是否存在前缀和刚好等于当前节点到根节点的前缀和 currcurr 减去 targetSum。

代码:

function helper(root, acc, target, hashmap) {
  if (root === null) return 0;
  let count = 0;
  acc += root.val;
  if (acc === target) count++;
  if (hashmap[acc - target] !== void 0) {
    count += hashmap[acc - target];
  }
  if (hashmap[acc] === void 0) {
    hashmap[acc] = 1;
  } else {
    hashmap[acc] += 1;
  }
  const res =
    count +
    helper(root.left, acc, target, hashmap) +
    helper(root.right, acc, target, hashmap);

  // 这里要注意别忘记了
  hashmap[acc] = hashmap[acc] - 1;

  return res;
}

var pathSum = function (root, sum) {
  const hashmap = {};
  return helper(root, 0, sum, hashmap);
};

标签:acc,hashmap,root,路径,leetcode,前缀,III,节点,总和
From: https://blog.51cto.com/codeniu/6188449

相关文章

  • #yyds干货盘点# LeetCode程序员面试金典:两两交换链表中的节点
    题目:给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。 示例1:输入:head=[1,2,3,4]输出:[2,1,4,3]示例2:输入:head=[]输出:[]示例3:输入:head=[1]输出:[1]代码实现:classSolution{publicListN......
  • #yyds干货盘点# LeetCode面试题:颜色分类
    1.简述:给定一个包含红色、白色和蓝色、共 n个元素的数组 nums ,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。我们使用整数0、 1和2分别表示红色、白色和蓝色。必须在不使用库内置的sort函数的情况下解决这个问题。 示例1:输入:nums=[2,0......
  • leetcode_打卡3
    leetcode_打卡3题目:1431.拥有最多糖果的孩子解答:classSolution{publicList<Boolean>kidsWithCandies(int[]candies,intextraCandies){intmax=0;intn=candies.length;List<Boolean>result=newArrayList<Boolean>();......
  • leetcode_打卡2
    leetcode_打卡21071.字符串的最大公因子思路:该题的答案一定是两个字符串的公共前缀,找到最大公共前缀,并且验证这个前缀能否被两个字符串除尽!classSolution{publicStringgcdOfStrings(Stringstr1,Stringstr2){intlen1=str1.length();intlen2=......
  • 回溯理论基础及leetcode
    回溯与递归相辅相成;回溯是递归的副产品,只要有递归就会有回溯。回溯函数也就是递归函数,指的都是一个函数。回溯搜索法纯暴力搜索解决的问题组合问题:N个数里面按一定规则找出k个数的集合切割问题:一个字符串按一定规则有几种切割方式子集问题:一个N个数的集合里有多少符合条......
  • #yyds干货盘点# LeetCode面试题:搜索二维矩阵
    1.简述:编写一个高效的算法来判断 mxn 矩阵中,是否存在一个目标值。该矩阵具有如下特性:每行中的整数从左到右按升序排列。每行的第一个整数大于前一行的最后一个整数。 示例1:输入:matrix=[[1,3,5,7],[10,11,16,20],[23,30,34,60]],target=3输出:true示例2:输入:matrix=[[1,......
  • Leetcode 2. 两数相加
    这道题让我想起了acwing里的高精度加法,因为这里的加法也是超过100位了。于是套着模板写了一下,然后看了一下评论区,发现链表再套vector属于是脱裤子放屁了/***Definitionforsingly-linkedlist.*structListNode{*intval;*ListNode*next;*ListNod......
  • [C++]LeetCode1147. 段式回文
    [C++]LeetCode1147.段式回文题目描述Difficulty:困难RelatedTopics:贪心,双指针,字符串,动态规划,哈希函数,滚动哈希你会得到一个字符串text。你应该把它分成k个子字符串(subtext1,subtext2,…,subtextk),要求满足:subtexti是非空字符串所有子字符串的连接......
  • Rabin-Karp-leetcode187
    DNA序列 由一系列核苷酸组成,缩写为 'A', 'C', 'G' 和 'T'.。例如, "ACGAATTCCG" 是一个 DNA序列 。在研究 DNA 时,识别DNA中的重复序列非常有用。给定一个表示 DNA序列 的字符串 s ,返回所有在DNA分子中出现不止一次的 长度为 10 的序列(子字符串)。你可以按 ......
  • LeetCode 450.删除二叉搜索树的结点
    1.题目:给定一个二叉搜索树的根节点root和一个值key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。一般来说,删除节点可分为两个步骤:首先找到需要删除的节点;如果找到了,删除它。示例1:输入:root=[5,3,6,2,4,null,......