leetcode437-路徑總和III

leetcode 437
在這里插入圖片描述

思路

利用前綴和+hash map解答

前綴和在這里的含義是:從根節點到當前節點的路徑上所有節點值的總和
我們使用一個 Map 數據結構來記錄這些前綴和及其出現的次數
具體思路如下:

  1. 初始化:創建一個 Map ,并將前綴和 0 出現的次數初始化為 1 。這是因為在遍歷開始時,我們還沒有訪問任何節點,此時的前綴和就是 0 ,它的出現次數為 1 次。同時,初始化一個變量 count 用于記錄滿足條件的路徑數量,初始值為 0
const map = new Map();?
map.set(0, 1);?
let count = 0;
  1. 深度優先搜索:定義一個遞歸函數 deep 用于進行深度優先遍歷。在每次遞歸中,我們計算當前節點的前綴和 curSum ,它等于從根節點到上一個節點的前綴和 sum 加上當前節點的值 root.val
const deep = (root, sum) => {?
if (!root) return;?
const curSum = sum + root.val;
  1. 判斷是否存在滿足條件的路徑:計算當前前綴和 curSum 與目標值 targetSum 的差值 diff ,即 diff = curSum - targetSum 。如果 Map 中存在 diff 這個前綴和,說明從根節點到當前節點的路徑中,存在一段子路徑的和等于目標值 targetSum ,那么滿足條件的路徑數量就需要加上 diff 出現的次數
const diff = curSum - targetSum?
if (map.has(diff)) {?count += map.get(diff);?
}
  1. 更新前綴和及其出現次數:如果 Map 中已經存在當前前綴和 curSum ,則將其出現次數加 1 ;否則,將 curSum 加入 Map ,并將其出現次數設置為 1
if (map.has(curSum)) {?map.set(curSum, map.get(curSum) + 1)?
} else {?map.set(curSum, 1)?
}
  1. 繼續遞歸遍歷左右子樹:分別對當前節點的左子樹和右子樹進行遞歸調用,繼續計算子樹中的前綴和
root.left && deep(root.left, curSum)?
root.right && deep(root.right, curSum)
  1. 回溯:在遞歸返回時,需要進行回溯操作。因為我們已經遍歷完當前節點的子樹,要回到上一層節點繼續遍歷,所以需要將當前前綴和 curSum 的出現次數減 1 ,以保證 Map 中記錄的前綴和狀態只反映從根節點到當前層節點的情況
map.set(curSum, map.get(curSum) - 1)

難點-使用回溯

在本題實現的過程中,可能會忽略掉回溯的步驟

那么為什么需要回溯操作

模擬實現:考慮如下二叉樹(目標和 targetSum = -1):

    1/ \-2  -3

若無回溯:

  1. 遍歷根節點 1
    • 前綴和 curSum = 1,差值 1 - (-1) = 2,map 中無 2,不計數
    • map 狀態:{0:1, 1:1}
    • 遞歸左子樹 -2
  2. 遍歷左子節點 -2
    • 前綴和 curSum = 1 + (-2) = -1,差值 -1 - (-1) = 0,map 中存在 0(初始值),計數 + 1(路徑[1, -2]正確)。
    • 未回溯時,map 狀態:{0:1, 1:1, -1:1}(保留 -1 的計數)。
    • 左、右子樹為空,返回根節點
  3. 遞歸右子樹 -3
    • 前綴和 curSum = 1 + (-3) = -2,差值 -2 - (-1) = -1
    • 此時 map 中存在 -1(來自左子樹的記錄),算法錯誤認為存在路徑和為 -1,計數 + 1
    • 錯誤結果:count = 2,但實際僅[1, -2]滿足條件

其實在這里第三步中diff = -1此時map中不應該存在-1這一項,因為這里的map只是1->-3 ,卻把1->2的部分也存儲了起來,導致結果的不準確,使得1->2這條路徑重復計算,結果出錯

回溯的作用(有回溯時)

  • 離開左子節點 -2 時,執行 map.set(-1, 0),map 恢復為 {0:1, 1:1}。
  • 遍歷右子樹 -3 時,前綴和 -2 的差值 -1 在 map 中無匹配,不計數。
  • 正確結果:count = 1

實現

var pathSum = function (root, targetSum) {const map = new Map();map.set(0, 1);let count = 0; // 滿足條件的路徑const deep = (root, sum) => {if (!root) return;const curSum = sum + root.val;const diff = curSum - targetSumif (map.has(diff)) {count += map.get(diff);}if (map.has(curSum)) {map.set(curSum, map.get(curSum) + 1)} else {map.set(curSum, 1)}// 左root.left && deep(root.left, curSum)// 右root.right && deep(root.right, curSum)// 回溯map.set(curSum, map.get(curSum) - 1)}deep(root, 0)return count;
};

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/912290.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/912290.shtml
英文地址,請注明出處:http://en.pswp.cn/news/912290.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

UI前端與數字孿生融合探索新領域:智慧家居的可視化設計與實現

hello寶子們...我們是艾斯視覺擅長ui設計、前端開發、數字孿生、大數據、三維建模、三維動畫10年經驗!希望我的分享能幫助到您!如需幫助可以評論關注私信我們一起探討!致敬感謝感恩! 一、引言:智慧家居的數字化轉型浪潮 在物聯網與人工智能技術的推動下&#xff0c…

數據結構知識點總結--緒論

1.1 數據結構的基本概念 1.1.1 基本概念和術語 主要涉及概念有: 數據、數據元素、數據對象、數據類型、數據結構 #mermaid-svg-uyyvX6J6ofC9rFSB {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-uyyvX6…

pip install mathutils 安裝 Blender 的 mathutils 模塊時,編譯失敗了

你遇到的問題是因為你試圖通過 pip install mathutils 安裝 Blender 的 mathutils 模塊時,編譯失敗了,主要原因是: 2018年 的老版本也不行 pip install mathutils2.79 ? 報錯核心總結: 缺失頭文件 BLI_path_util.h:…

編譯安裝交叉工具鏈 riscv-gnu-toolchain

參考鏈接: https://zhuanlan.zhihu.com/p/258394849 1,下載源碼 git clone https://gitee.com/mirrors/riscv-gnu-toolchain 2,進入目錄 cd riscv-gnu-toolchain 3,去掉qemu git rm qemu 4,初始化 git submodule…

復制 生成二維碼

一、安裝插件 1、復制 npm install -g copy-to-clipboard import copy from copy-to-clipboard; 2、生成二維碼 & 下載 npm install -g qrcode import QRCode from qrcode.react; 二、功能:生成二維碼 & 下載 效果圖 1、常規使用(下載圖片模糊…

自由職業的經營視角

“領導力的核心是幫助他人看到自己看不到的東西。” — 彼得圣吉 最近與一些自由職業者的交流中,發現很多專業人士都會從專業視角來做交流,這也讓我更加理解我們海外戰略顧問莊老師在每月輔導時的提醒——經營者視角和專業人士視角的不同。這不僅讓大家獲…

MR30分布式 IO在物流堆垛機的應用

在現代物流行業蓬勃發展的浪潮中,物流堆垛機作為自動化倉儲系統的核心設備,承擔著貨物的高效存取與搬運任務。它憑借自動化操作、高精度定位等優勢,極大地提升了倉儲空間利用率和貨物周轉效率。然而,隨著物流行業的高速發展&#…

告別固定密鑰!在單一賬戶下用 Cognito 實現 AWS CLI 的 MFA 單點登錄

大家好,很多朋友,特別是通過合作伙伴或服務商使用 AWS 的同學,可能會發現自己的 IAM Identity Center 功能受限,無法像在組織管理賬戶里那樣輕松配置 CLI 的 SSO (aws configure sso)。那么,我們就要放棄治療&#xff…

未來機器視覺軟件將更注重成本控制,邊緣性能,魯棒性、多平臺支持、模塊優化與性能提升,最新版本opencv-4.11.0更新了什么

OpenCV 4.11.0 作為 4.10.0 的后續版本,雖然沒有在提供的搜索結果中直接列出詳細更新內容,但結合 OpenCV 4.10.0 的重大改進方向(發布于 2024 年 6 月),可以合理推斷 4.11.0 版本可能延續了對多平臺支持、模塊優化和性能提升的強化。以下是基于 OpenCV 近期更新模式的推測…

小程序入門:數據請求全解析

在微信小程序開發中,數據請求是實現豐富功能的關鍵環節。本文將帶你深入了解小程序數據請求的相關知識,包括請求限制、配置方法以及不同請求方式的實現,還會介紹如何在頁面加載時自動請求數據,同時附上詳細代碼示例,讓…

開源版gpt4o 多模態MiniGPT-4 實現原理詳解

MiniGPT-4是開源的GPT-4的平民版。本文用帶你快速掌握多模態大模型MiniGPT-4的模型架構、訓練秘訣、實戰亮點與改進方向。 1 模型架構全景:三層協同 📊 模型底部實際輸入圖像,經 ViT Q-Former 編碼。藍色方塊 (視覺編碼器):左側…

Flutter基礎(控制器)

第1步:找個遙控器(創建控制器)? // 就像買新遙控器要裝電池 TextEditingController myController TextEditingController(); ??第2步:連上你的玩具(綁定到組件)?? TextField(controller: myContro…

Spring Boot使用Redis常用場景

Spring Boot使用Redis常用場景 一、概述:Redis 是什么?為什么要用它? Redis(Remote Dictionary Server)是一個內存中的數據存儲系統(類似一個“超級大字典”),它能存各種類型的數據…

CAD文件處理控件Aspose.CAD教程:在 C# 中將 DXF 文件轉換為 SVG - AutoCAD C# 示例

概述 使用 C# 輕松將DXF文件轉換為SVG。此轉換可更好地兼容 Web 應用程序,并增強 CAD 圖紙的視覺呈現效果。使用Aspose.CAD for .NET ,開發人員可以輕松實現此轉換過程。該 SDK 提供強大的功能,使其成為 C# 開發人員的可靠選擇。Aspose.CAD …

Gitee 持續集成與交付(CI/CD)篇

Gitee 持續集成與交付(CI/CD)篇 🚀 文章目錄 Gitee 持續集成與交付(CI/CD)篇 🚀🎯 什么是 CI/CD?🌟 Gitee Go 介紹? 核心特性🎨 支持的技術棧 🚀…

深度學習:PyTorch卷積神經網絡圖像分類案例分享

本文目錄: 一、了解CIFAR-10數據集二、案例之導包三、案例之創建數據集四、案例之搭建神經網絡(模型構建)五、案例之編寫訓練函數(訓練模型)六、案例之編寫預測函數(模型測試) 前言:…

記錄多功能按鍵第二種寫法使用定時器周期間隔判斷.

邏輯是通過定時器溢出周期進行判斷按下次數 比如設置定時器溢出周期為500MS,每次溢出都會判斷按鍵按下次數,如果下個周期前沒有觸發按下,則結束鍵值判斷.并確定觸發鍵值.清空按下次數標志.測試比一個定時器周期按下按鍵次數判斷寫法要穩定... 記錄STM32實現多功能按鍵_stm32一…

【安卓Sensor框架-1】SensorService 的啟動流程

內核啟動后,首個用戶空間進程init(pid1)解析init.rc配置文件,啟動關鍵服務(如Zygote和ServiceManager)。 Zygote服務配置為/system/bin/app_process --zygote --start-system-server,后續用于孵…

centos網卡綁定參考

同事整理分享: 1. 加載 Bonding 模塊 modprobe bonding 獲取網卡名稱 ip a 找到接了網線的網卡名稱,記下。 3. 配置物理網卡 創建并編輯 /etc/sysconfig/network-scripts/ifcfg-ens36(ifcfg-后面的內容根據上面找到的具體網卡名稱決定&#…

mbedtls ssl handshake error,res:-0x2700

用LinkSDK.c連接第三方云平臺出現現象 解決方案: 在_tls_network_establish函數中加入 mbedtls_ssl_conf_authmode(&adapter_handle->mbedtls.ssl_config, MBEDTLS_SSL_VERIFY_NONE);原因解釋:用連接方式是不用證書認證/跳過服務端認證。