LeetCode 437 路徑和 III

Mondo 教育 更新 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 ,,,,,...