java數據結構與算法刷題-----LeetCode437. 路徑總和 III(前綴和必須掌握)

java數據結構與算法刷題目錄(劍指Offer、LeetCode、ACM)-----主目錄-----持續更新(進不去說明我沒寫完):https://blog.csdn.net/grd_java/article/details/123063846

文章目錄

    • 1. 深度優先
    • 2. 前綴和

在這里插入圖片描述

1. 深度優先

解題思路:時間復雜度O( n 2 n^2 n2),空間復雜度O(n)
  1. 從最下層結點開始,以每個結點為根結點,再次從上到下深度優先遍歷
  2. 試圖找到符合條件的路徑
  3. 很顯然,是雙重深度優先遍歷
  4. 先深度優先遍歷所有結點,然后每個結點還得再深度優先遍歷一下找路徑
  5. 所以是N^2時間復雜度
代碼

在這里插入圖片描述

class Solution {//計算路徑和public int pathSum(TreeNode root, int targetSum) {if (root == null) {return 0;}//獲取以當前為根結點的路徑和int ret = rootSum(root, targetSum);//深度優先遍歷ret += pathSum(root.left, targetSum);ret += pathSum(root.right, targetSum);return ret;}//計算當前根結點的路徑和,對于每個結點都進行從上到下的深度優先遍歷//看看有沒有符合條件的路徑-------窮舉法public int rootSum(TreeNode root, long targetSum) {int ret = 0;//深度優先,記錄符合條件的路徑數目if (root == null) {return 0;}int val = root.val;//獲取當前結點值if (val == targetSum) {//如果當前值 == targetSum 結果+1,注意這里targetSum是減去前面結點,還需要多少ret++;} //深度優先,傳入,targetSum - 當前結點值,還需要多少ret += rootSum(root.left, targetSum - val);//左子樹符合條件的ret += rootSum(root.right, targetSum - val);//右子樹符合條件的return ret;//返回當前結點符合條件的}
}

2. 前綴和

解題思路:時間復雜度O(n),空間復雜度O(n).其中空間復雜度是2n,因為需要一個map,深度優先遍歷需要棧空間也是n,所以是2n時間復雜度,比上一個方法的空間復雜度多一倍。但是時間復雜度比它快n倍
  1. 深度優先遍歷
  2. 遍歷過程中,記錄前綴和(就是從根結點到當前結點的和)到map中
  3. 每遍歷一個結點,都用當前前綴和 - 目標值,看看差多少,并從map中找這個差值
  1. 如果找到這個差值,說明當前前綴 - 當前路徑上的某個子前綴,是一個符合條件的路徑
  2. 如果沒有,說明沒找到,繼續向下遍歷
  1. 當某個結點深度遍歷完成,向上返回時,那么包含這個結點的前綴和就沒有用了,需要從map中去掉
圖解:找目標路徑長度為8
  1. 初始狀態下,前綴map,key保存前綴0,value保存此前綴有幾個,為1
    在這里插入圖片描述
  2. 深度遍歷根結點10,則當前路徑前綴長度為10,10 - 8 = 2,也就是當前前綴比目標值多2.不符合條件。繼續深度優先遍歷,并將當前前綴和10放入map,此前綴有目前有1個
    在這里插入圖片描述
  3. 深度遍歷到結點5,當前路徑前綴和為15,15-8 = 7,map中找7找不到,所以將15:1放入map
    在這里插入圖片描述
  4. 繼續遍歷到結點3,當前路徑前綴和為18,18 - 8 = 10.此時map中發現10,也就是說,當前路徑比目標值8多10,而10就在此路徑的子前綴中,所以我們可以去掉10這個結點,這樣我們就找到了第一個符合條件的路徑,5和3。另外不要忘了將當前前綴和放入map,也就是18:1放入map
    在這里插入圖片描述
  5. 繼續向下,遍歷結點3,此時發現前綴和為21,21 - 8 = 13,map中沒有,放入前綴和21:1
    在這里插入圖片描述
  6. 繼續向下,我們發現已經到底,需要回溯了,回到父結點之前,需要先刪除當前前綴和,21:1,然后再回父結點。之后繼續遍歷,重復上述步驟。
    在這里插入圖片描述
代碼: 官方增加了測試用例,所以相同的代碼已經無法擊敗100%了

在這里插入圖片描述

class Solution {public int pathSum(TreeNode root, int targetSum) {Map<Long, Integer> prefix = new HashMap<Long, Integer>();//用Map保存前綴和prefix.put(0L, 1);//初始放入前綴和0,和其1return dfs(root, prefix, 0, targetSum);//進入遞歸}public int dfs(TreeNode root, Map<Long, Integer> prefix, long curr, int targetSum) {if (root == null) return 0;int ret = 0;//符合條件的路徑條數curr += root.val;//當前路徑值(前綴和)//看看當前路徑和 - 目標值,是否等于路徑上的一個前綴//如果是的話,說明當前路徑,去掉某些前綴結點,剛好符合targetSum//如果沒有,那么ret依然是0ret = prefix.getOrDefault(curr - targetSum, 0);//將當前路徑前綴和,加入到map中prefix.put(curr, prefix.getOrDefault(curr, 0) + 1);//深度優先ret += dfs(root.left, prefix, curr, targetSum);ret += dfs(root.right, prefix, curr, targetSum);//----------當此結點的遍歷出棧時,要將map中對應的前綴和去掉。否則其它路徑的前綴和很可能和當前路徑的前綴和沖突-------------prefix.put(curr, prefix.getOrDefault(curr, 0) - 1);//返回符合條件路徑條數return ret;}
}

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

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

相關文章

kibana7.17.7 將數據導出csv文件

配置kibana文件 首先先配置kibana.yaml內容如下&#xff0c;這里假設我的服務器ip地址為192.168.130.128&#xff0c;elasticsearch的ip地址為&#xff1a;192.168.130.129:9200&#xff0c;192.168.130.130:9200&#xff1a; server.host: "192.168.130.128" serv…

每日OJ題_分治歸并③_力扣315. 計算右側小于當前元素的個數

目錄 315. 計算右側小于當前元素的個數 解析代碼 力扣315. 計算右側小于當前元素的個數 315. 計算右側小于當前元素的個數 難度 困難 給你一個整數數組 nums &#xff0c;按要求返回一個新數組 counts 。數組 counts 有該性質&#xff1a; counts[i] 的值是 nums[i] 右側…

MongoDB 未授權訪問

開啟 MongoDB 服務時不添加任何參數時,默認是沒有權限驗證的,而且可以遠程訪問數據庫&#xff0c; 登錄的 用戶可以通過默認端口無需密碼對數據庫進行增、刪、改、查等任意高危操作。 防護 為 MongoDB 添 加 認 證 &#xff1a; 1)MongoDB 啟動時添加–auth參數 2)給 MongoD…

Java 讀寫 ini ( 調用 Windows Api )

市面上讀取 ini 的包都是 讀取整個文件到內存中,再獲取和修改值, 最后自己再調用保存文件, 這種方式在讀取大文件的時候 非常的不友好. windows api 中有現成的高效方法 安裝 jna-platform (里面封裝了各個系統的 api ,直接用就行. 不用再手動寫固定的函數定義) jna-platfor…

JPA常見異常 JPA可能拋出的異常

1、EntityNotFoundException&#xff08;實體不存在異常&#xff09;: 通過 JPA 查找一個不存在的實體。 2、NonUniqueResultException&#xff08;非唯一結果異常&#xff09;&#xff1a; 查詢返回了多個結果&#xff0c;但期望只有一個結果。 3、TransactionRequiredExcep…

AutoSAR(基礎入門篇)13.1-EB Tresos使用初探

目錄 一、新建工程 二、添加和刪除模塊 三、界面 四、代碼生成 1、直接生成代碼

Mac 以SH腳本安裝Arthas

SH腳本安裝Aethas curl -L https://alibaba.github.io/arthas/install.sh | sh安裝腳本說明 示例源文件&#xff1a; #! /bin/bash# temp file of as.sh TEMP_ARTHAS_FILE"./as.sh.$$"# target file of as.sh TARGET_ARTHAS_FILE"./as.sh"# update timeo…

微服務中的Feign:優雅實現遠程調用的秘密武器(一)

本系列文章簡介&#xff1a; 本系列文章將深入探討Feign的特點、原理以及在微服務中的應用場景&#xff0c;幫助讀者更好地理解和使用這個優秀的遠程調用工具。無論您是初學者還是有經驗的開發人員&#xff0c;本文都將為您揭示Feign的秘密&#xff0c;并帶您一起走進微服務的世…

人類與機器的不同交流特點

對人類而言&#xff0c;事實是用來交流的&#xff0c;價值是用來自我交流的。事實是用來交流的&#xff0c;是通過提供準確、可證實的信息來傳遞和共享知識的。事實具有客觀性&#xff0c;不受個人主觀意見的影響。通過分享事實&#xff0c;人們可以更好地理解世界和彼此&#…

Android挖取原圖手指觸點區域RectF(并框線標記)放大到ImageView寬高與矩陣mapRadius,Kotlin

Android挖取原圖手指觸點區域RectF(并框線標記)放大到ImageView寬高與矩陣mapRadius&#xff0c;Kotlin 這里 Android挖取原圖中心區域RectF(并框線標記)放大到ImageView寬高&#xff0c;Kotlin-CSDN博客 實現的是把原圖中心區域的一片小圖挖取出來放大放到下面的ImageView里面…

if語句用法

if語句是單條件分支語句 定義&#xff1a;根據一個條件來控制程序執行流程(如圖3.2)。 語法格式&#xff1a; if&#xff08;表達式&#xff09;{ 若干語句 } ★注意★&#xff1a; ① 表達式的值必須是boolean 型&#xff1b; ② 不能用0代表false&#xff1b;用1代表 true&am…

德人合科技 | —數據泄露可能會對公司造成哪些影響?

數據泄露可能會對公司造成多方面的影響&#xff0c;以下是一些可能的影響&#xff1a; 財務損失&#xff1a;數據泄露可能導致公司遭受財務損失。攻擊者可能會盜取公司的敏感信息&#xff0c;如客戶信息、銀行賬戶信息、商業機密等&#xff0c;并利用這些信息進行欺詐、盜竊等非…

「優選算法刷題」:驗證棧序列

一、題目 給定 pushed 和 popped 兩個序列&#xff0c;每個序列中的 值都不重復&#xff0c;只有當它們可能是在最初空棧上進行的推入 push 和彈出 pop 操作序列的結果時&#xff0c;返回 true&#xff1b;否則&#xff0c;返回 false 。 示例 1&#xff1a; 輸入&#xff1a…

本地maven庫緩存導入私庫

為了加速編譯代碼&#xff0c;想將本地maven緩存導入內網私庫使用。 腳本網上搜的 #!/bin/bash # copy and run this script to the root of the repository directory containing files # this script attempts to exclude uploading itself explicitly so the script name …

高效備考2024年AMC10:吃透2000-2023年1250道AMC10真題

距離2024年AMC10的比賽只有8個月多一點的時間了&#xff0c;如何備考AMC10美國數學競賽最有效&#xff1f;參加AMC10競賽是否一定要參加機構的培訓班&#xff1f;吃透歷年真題是有效的自學、了解AMC10和備考策略之一。事實上&#xff0c;網絡上有很多關于AMC10的學習資源&#…

Github 2024-03-02 開源項目日報Top9

根據Github Trendings的統計&#xff0c;今日(2024-03-02統計)共有9個項目上榜。根據開發語言中項目的數量&#xff0c;匯總情況如下&#xff1a; 開發語言項目數量非開發語言項目2Rust項目1JavaScript項目1Shell項目1C項目1TypeScript項目1C#項目1Python項目1 任天堂Switch模…

InnoDB備份與恢復篇(4)-InnoDB的故障恢復與日志分析

在MySQL數據庫中&#xff0c;InnoDB是一種非常常用的存儲引擎。它提供了高性能和可靠性&#xff0c;同時也具備故障恢復和日志分析的能力。本文將介紹InnoDB的故障恢復機制和日志分析方法。 一、故障恢復機制 事務和寫日志&#xff1a; 在InnoDB中&#xff0c;所有的數據操作都…

NIST網絡安全框架2.0版發布:十年磨一劍,安全再升級

美國國家標準與技術研究院(NIST)近日發布了網絡安全框架(CSF)的2.0正式版本&#xff0c;這是2014年該框架發布后十年來首次重大更新。新框架版本極大擴展了適用范圍&#xff0c;重點關注治理和供應鏈問題&#xff0c;并提供了豐富的資源以加速框架實施。 NIST正式發布的網絡安全…

決定西弗吉尼亞州地區版圖的關鍵歷史事件

決定西弗吉尼亞州地區版圖的關鍵歷史事件&#xff1a; 1. 內部分裂與美國內戰&#xff1a; - 在1861年美國內戰爆發時&#xff0c;弗吉尼亞州作為南方邦聯的一員宣布退出美利堅合眾國。然而&#xff0c;弗吉尼亞州西部的一些縣由于經濟結構&#xff08;主要是農業非依賴奴隸制…

使用Python進行Sentinel-2 圖像聚類

聚類或無監督分類是根據統計相似性將圖像的像素值分組或聚合到一定數量的自然類(組)的過程。在本教程中,我們將使用rasterio進行sentinel-2圖像處理,并使用功能強大的完整scikit-learn python 包在jupyter Notebook中進行聚類。 Scikit-learn是一個用于 Python 編程語言的…