LeetCode 437 路径和 III

小夏 教育 更新 2024-01-29

给定一个二叉树,它的每个节点都包含一个整数值。

找到路径总数并等于给定值。

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

二叉树不超过 1000 个节点,节点取值范围为 [-1000000,1000000] 的整数。

示例:root = [10,5,-3,3,2,null,11,3,-2,null,1], sum = 8

返回 3. 总和等于 8 的路径为:

hashmap 阿里腾讯字节问题是求解从任意节点到后代节点的路径,并将其求和为指定值。 请注意,它不必从根节点开始或在叶节点结束。

一个简单的思维方式是直接递归求解,空间复杂度为o(n),时间复杂度介于o(nlogn)和o(n 2)之间,具体**:

/** definition for a binary tree node. *function treenode(val) /// the number of the paths starting from selffunction helper(root, sum) /** param root * param sum * return */var pathsum = function (root, sum) ;
然而,还有一种空间复杂度更好的算法,它使用hashmap来避免重复计算,并且时间复杂度和空间复杂度均为o(n)。 这个思路是:subarray-sum-equals-k如果能解决问题o(n),问题就不是很困难了,但是数组会被二叉树代替。

这里有一个区别,我将解释为什么会有一个hashmap[acc] = hashmap[acc] -1;原因很简单,就是当我们 dfs 的时候,当我们从底部回到顶部时,地图的值也应该回溯。 如果你熟悉回顾法,应该很容易理解,这个问题就通过了templist.pop()完成。

另外,我画了一张图,相信你看完就会明白了。

当我们到达底部时:

然后返回:

很容易看出,我们的哈希图不应该与第一个哈希图具有相同的记录,因此需要减去它。

有关具体实现,请参阅下面的 ** 区域。

通过hashmap,空间换时间语言支持:js、pythonjs代码:

lc app=leetcode id=437 lang=j**ascript * 437] path sum iii *//** definition for a binary tree node. *function treenode(val) /function helper(root, acc, target, hashmap) if (hashmap[acc] === void 0) else 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) ;return helper(root, 0, sum, hashmap);}python code:

import collections'''class treenode: def __init__(self, val=0, left=none, right=none): self.val = val self.left = left self.right = right'''class solution: def helper(self,root,acc,target,hashmap): if not root: return 0 count=0 acc+=root.val if acc==target: count+=1 if acc-target in hashmap: count+=hashmap[acc-target] hashmap[acc]+=1 if root.left: count+=self.helper(root.left,acc,target,hashmap) if root.right: count+=self.helper(root.right,acc,target,hashmap) hashmap[acc]-=1 return count def pathsum(self, root: optional[treenode], targetsum: int) -int: hashmap=collections.defaultdict(lambda:0) return self.helper(root,0,targetsum,hashmap)
复杂性分析时间复杂度:$o(n)$Spatial复杂度:$o(n)$

相似文章

    Leetcode 2009 使数组具有最少的操作数

    给你一个整数 nums 数组。在每个操作中,您都可以将 nums 中的任何元素替换为任意整数。如果 Nums 满足以下条件,则它是连续的 nums 中的所有元素彼此不同。nums 中最大元素和最小元素之间的差值等于 numslength 例如,nums ,,, 是连续的,但 nums ,,,, 不是...

    Leetcode 1671 获取山阵列的最小删除次数

    当且仅当 arr 满足以下条件时,我们将 arr 定义为山峰阵列 arr.length 有一个下标 i 从 开始 满足 i arr长度 和 arr arr i arr i arr arr.length 给定一个整数数组 nums,请返回将 nums 删除到山形数组中的最小次数。示例 输入 nums ...

    LeetCode 32 个最长的有效括号

    仅给定一个收容 跟 以查找包含有效括号的最长子字符串的长度。示例 输入 输出 解释 最长的有效括号子字符串是 示例 输入 输出 解释 最长的有效括号子字符串是 对阿里巴巴腾讯字节进行动态编程的直观方法是分别计算以 i 开头的最长有效括号 i 从 到 n 并从中取最大的括号。支持 Python 类解决...

    LeetCode39 组合和

    image.PNG 问题地址 组合和 LeetCode 给你没有重复的元素整数数组candidates和目标整数target找出答案candidates您可以制作目标的数量和数量target在所有不同的组合并以列表形式返回。您可以按 以任何顺序返回这些组合。candidates相同数字可以选择无限重...

    LeetCode 88 合并了两个有序数组

    给定两个有序整数数组 nums 和 nums,将 nums 合并到 nums 中,使 num 成为有序数组。说明 初始化 nums 和 nums 的元素个数分别为 m 和 n。您可以假设 nums 有足够的空间 空间大小大于或等于 m n 来容纳 nums 中的元素。示例 输入 nums ,,,,,...