【力扣hot100】刷題筆記Day14

前言

  • 又是新的一周,快樂的周一,快樂地刷題,今天把鏈表搞完再干活!

114. 二叉樹展開為鏈表 - 力扣(LeetCode)

  • 前序遍歷

    • class Solution:def flatten(self, root: Optional[TreeNode]) -> None:if not root:returnst = [root]pre = Nonewhile st:cur = st.pop()# 把當前遍歷結點接到上一個遍歷結點上if pre:pre.left = Nonepre.right = cur  if cur.right:st.append(cur.right)if cur.left:st.append(cur.left)pre = curreturn root
      
  • 前驅結點

    • class Solution:def flatten(self, root: Optional[TreeNode]) -> None:cur = rootwhile cur:pre = curif cur.left:cur = cur.leftwhile cur.right:cur = cur.right  # cur指向pre左子樹的最右(前驅)cur.right = pre.right  # pre右子樹接在前驅上pre.right = pre.left  # pre左子樹移到右子樹pre.left = None  # pre左指針置為Nonecur = pre.right  # cur繼續往右return root

105. 從前序與中序遍歷序列構造二叉樹 - 力扣(LeetCode)

  • 遞歸:復制數組O(n2)

    • class Solution:def buildTree(self, preorder: List[int], inorder: List[int]) -> Optional[TreeNode]:if not preorder:return Noneroot = TreeNode(preorder[0])  # 構造根節點idx = inorder.index(preorder[0])  # 找到根節點在中序中的idx,O(n)root.left = self.buildTree(preorder[1: idx+1], inorder[0: idx])  # 遞歸構造左子樹root.right = self.buildTree(preorder[idx+1:], inorder[idx+1:])   # 遞歸構造右子樹return root
  • 遞歸:數組下標+哈希O(n)

    • ?

    • class Solution:def buildTree(self, preorder: List[int], inorder: List[int]) -> TreeNode:def dfs(i, l, r):if r - l < 0:return None  # 子樹區間為空時終止root = TreeNode(preorder[i])  # 初始化根節點m = inorder_map[preorder[i]]  # 查詢 m ,從而劃分左右子樹root.left = dfs(i + 1, l, m - 1)  # 子問題:構建左子樹root.right = dfs(i + 1 + m - l, m + 1, r)  # 子問題:構建右子樹return root      # 回溯返回根節點# 初始化哈希表,存儲 inorder 元素到索引的映射inorder_map = {val: i for i, val in enumerate(inorder)}root = dfs(0, 0, len(inorder) - 1)return root
  • 迭代

    • 比較難理解和模擬,可以只記上面的遞歸方法即可,參考官解
    • class Solution:def buildTree(self, preorder: List[int], inorder: List[int]) -> TreeNode:if not preorder:return Noneroot = TreeNode(preorder[0])stack = [root]inorderIndex = 0for i in range(1, len(preorder)):preorderVal = preorder[i]node = stack[-1]if node.val != inorder[inorderIndex]:node.left = TreeNode(preorderVal)stack.append(node.left)else:while stack and stack[-1].val == inorder[inorderIndex]:node = stack.pop()inorderIndex += 1node.right = TreeNode(preorderVal)stack.append(node.right)return root

?437. 路徑總和 III - 力扣(LeetCode)

  • 雙重遞歸

    • 兩種方法思路參考題解
    • class Solution:# 求包含與不包含root的所有路徑中滿足要求的路徑數def pathSum(self, root: TreeNode, sum: int) -> int:if not root:return 0return self.dfs(root, sum) + self.pathSum(root.left, sum) + self.pathSum(root.right, sum)# 求包含root的所有路徑中滿足要求的路徑數    def dfs(self, root, path):if not root:return 0path -= root.valreturn (1 if path==0 else 0) + self.dfs(root.left, path) + self.dfs(root.right, path)
  • ?前綴和 + 哈希

    • class Solution:def pathSum(self, root: Optional[TreeNode], targetSum: int) -> int:prefixSumTree = {0:1}  # 前綴和:個數self.count = 0  # 答案prefixSum = 0  # 記錄當前前綴和self.dfs(root, sum, prefixSum, prefixSumTree)return self.countdef dfs(self, root, targetSum, prefixSum, prefixSumTree):if not root:return 0prefixSum += root.valoldSum = prefixSum - targetSum  # 之前可能存在的等于目標和的路徑和=當前前綴和-目標和if oldSum in prefixSumTree:self.count += prefixSumTree[oldSum]  # 存在的話結果加上路徑數prefixSumTree[prefixSum] = prefixSumTree.get(prefixSum, 0) + 1  # 如果不用collections.defaultdict,鍵不存在就返回默認值0,再+1self.dfs(root.left, targetSum, prefixSum, prefixSumTree)self.dfs(root.right, targetSum, prefixSum, prefixSumTree)'''一定要注意在遞歸回到上一層的時候要把當前層的prefixSum的個數-1,類似回溯,要把條件重置'''prefixSumTree[prefixSum] -= 1

?236. 二叉樹的最近公共祖先 - 力扣(LeetCode)

  • 遞歸后序

    • class Solution:def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':if not root or root == p or root == q:return rootleft = self.lowestCommonAncestor(root.left, p, q)right = self.lowestCommonAncestor(root.right, p, q)if left and right: return root  # 找到祖先了if not left: return right   # 一邊沒有就返回另一邊if not right: return left

?124. 二叉樹中的最大路徑和 - 力扣(LeetCode)

  • 遞歸后序

    • class Solution:def maxPathSum(self, root: Optional[TreeNode]) -> int:self.maxSum = -float('inf')  # 以防路徑是負值# 遞歸計算左右子節點的最大貢獻值def maxGain(node):if not node:return 0leftGain = maxGain(node.left)    # 左貢獻rightGain = maxGain(node.right)  # 右貢獻newPath = leftGain + rightGain + node.val  # 最大路徑 = 左右貢獻值+當前值self.maxSum = max(self.maxSum, newPath)  # 更新答案return max(max(leftGain, rightGain) + node.val, 0)  # 返回貢獻值,為負數就不貢獻了maxGain(root)return self.maxSum   

?后言

  • 搞定二叉樹咯,頭好暈啊,肯定是天氣凍的,晚上再簡單干點活就可以玩耍咯

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

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

相關文章

回溯 Leetcode 51 N皇后

N皇后 Leetcode 51 學習記錄自代碼隨想錄 按照國際象棋的規則&#xff0c;皇后可以攻擊與之處在同一行或同一列或同一斜線上的棋子。 n 皇后問題 研究的是如何將 n 個皇后放置在 nn 的棋盤上&#xff0c;并且使皇后彼此之間不能相互攻擊。 給你一個整數 n &#xff0c;返回所…

Linux —— 鏈接文件

硬鏈接 一般情況下&#xff0c;文件名和inode號碼是"一一對應"關系&#xff0c;每個inode號碼對應一個文件名。但是&#xff0c;Unix/Linux系統允許&#xff0c;多個文件名指向同一個inode號碼。 這意味著&#xff0c;可以用不同的文件名訪問同樣的內容&#xff1b;對…

軟件開發常見模型解析

軟件開發常見模型解析 摘要&#xff1a;本文將為您詳細介紹軟件開發過程中常見的幾種模型&#xff0c;包括瀑布模型、敏捷開發模型、螺旋模型、迭代模型和原型模型。通過了解這些模型的原理、優缺點&#xff0c;幫助您在不同的軟件項目中選擇最適合的開發模型。 一、引言 在…

【IC前端虛擬項目】inst_buffer子模塊DS與RTL編碼

【IC前端虛擬項目】數據搬運指令處理模塊前端實現虛擬項目說明-CSDN博客 需要說明一下的是,在我所提供的文檔體系里,并沒有模塊的DS文檔哈,因為實際項目里我也不怎么寫DS畢竟不是每個公司都和HISI一樣對文檔要求這么嚴格的。不過作為一個培訓的虛擬項目,還是建議在時間充裕…

Docker技術概論(3):Docker 中的基本概念

Docker技術概論&#xff08;3&#xff09; Docker 中的基本概念 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https://…

基于java+springboot女士電商平臺系統源碼+文檔設計

基于javaspringboot女士電商平臺系統源碼文檔設計 博主介紹&#xff1a;多年java開發經驗&#xff0c;專注Java開發、定制、遠程、文檔編寫指導等,csdn特邀作者、專注于Java技術領域 作者主頁 央順技術團隊 Java畢設項目精品實戰案例《1000套》 歡迎點贊 收藏 ?留言 文末獲取源…

C語言----動態內存管理(2)

1.這里總結動態內存管理里面的錯誤 &#xff08;1&#xff09;使用malloc開辟空間以后直接賦值 這個就是malloc開辟失敗返回空指針&#xff0c;直接給空指針賦值就是錯誤的&#xff0c; tip1:使用malloc開辟空間以后一定要判斷是否為空 &#xff08;2&#xff09; 越界訪問…

Python批量提取文件夾中圖片的名稱及路徑到指定的.txt文件中

目錄 一、代碼二、提取效果 一、代碼 import os# 定義要保存的文件名 file_name "TestImage/Image_Visible_Gray.txt"# 讀取文件夾路徑 folder_path "TestImage/Image_Visible_Gray"# 遍歷文件夾中的所有文件 with open(file_name, "w") as f…

IO進程線程day1

編寫鏈表&#xff0c;鏈表里面隨便搞點數據&#xff0c;使用fprintf將鏈表中所有的數據保存到文件中&#xff0c;用fscanf讀取文件中的數據寫入鏈表中 #include <stdio.h> #include <stdlib.h>typedef struct Node {int data;struct Node* next; } Node;// 創建新…

可移植性(兼容性)測試指南

可移植性是指應用程序能夠安裝到不同的環境中&#xff0c;在不同的環境中使用&#xff0c;甚至可以移動到不同的環境中。當然&#xff0c;前兩者對所有系統都很重要。就PC軟件而言&#xff0c;鑒于操作系統、共存和互操作應用程序、硬件、帶寬可用性等方面的快速變化&#xff0…

抖店如何運營?新手應該怎么做?從入門到精通詳細講解!

我是電商珠珠 做抖店必須先搞懂它的基礎流程&#xff0c;流程搞懂了&#xff0c;才能有進一步的可能。不要急功近利&#xff0c;想要一口吃個胖子&#xff0c;這樣做就會直接造成店鋪被清店&#xff0c;扣除保證金&#xff0c;甚至還會埋怨自己沒用。 我做電商已經三年多的時…

vue3 日期延后一天

問題&#xff1a;提交信息時要求將所選日期延后一天進行提交解決過程&#xff1a;1.定義延后一天的計算方法&#xff0c;在提交前&#xff0c;將提交日期傳入調用該方法 2.對延后的日期進行格式化&#xff0c;最后格式為yy-mm-dd解決結果&#xff1a; const…

c++ - pointer convert - class member function‘s pointer <==> void*

文章目錄 c - pointer convert - class member functions pointer <> void*概述筆記END c - pointer convert - class member function’s pointer <> void* 概述 想將結構體中的void指針賦值為類成員函數的指針, 用于回調. 這個結構體相關的函數寫完, 就不用再因…

Stable Diffusion中的Clip模型

基礎介紹 Stable Diffusion 是一個文本到圖像的生成模型&#xff0c;它能夠根據用戶輸入的文本提示&#xff08;prompt&#xff09;生成相應的圖像。在這個模型中&#xff0c;CLIP&#xff08;Contrastive Language-Image Pre-training&#xff09;模型扮演了一個關鍵的角色&a…

Biotin aniline,生物素苯胺,用于研究蛋白質結構和功能

您好&#xff0c;歡迎來到新研之家 文章關鍵詞&#xff1a;769933-15-5&#xff0c;Biotin aniline&#xff0c;生物素苯胺&#xff0c;Biotin-aniline&#xff0c;生物素-苯胺 一、基本信息 【產品簡介】&#xff1a;Biotin aniline is composed of three parts: biotin, w…

個人或者小團隊選擇C語言還是c++?

個人或者小團隊選擇C語言還是c? 在開始前我有一些資料&#xff0c;是我根據網友給的問題精心整理了一份「C語言的資料從專業入門到高級教程」&#xff0c; 點個關注在評論區回復“888”之后私信回復“888”&#xff0c;全部無償共享給大家&#xff01;&#xff01;&#xff0…

使用Python語言實現一個基于動態數組的序列隊列

一、動態數組的實現 首先&#xff0c;我們需要創建一個DynamicArray類&#xff0c;該類將管理我們的動態數組。 動態數組能夠動態地調整其大小&#xff0c;以容納更多的元素。 目錄 一、動態數組的實現 代碼示例&#xff1a; 二、序列隊列的實現 接下來&#xff0c;我…

學習JAVA的第八天(基礎)

目錄 多態 前提 形式 測試類 調用成員的特點 優勢 劣勢 包 注意事項&#xff1a; final關鍵字 常量 命名規范&#xff1a; 注意事項&#xff1a; 權限修飾符 分類 代碼塊 局部代碼塊 構造代碼塊 靜態代碼塊 抽象類 抽象類&#xff1a; 定義格式 抽象…

代碼隨想錄算法訓練營第五天

● 自己看到題目的第一想法 242. 有效的字母異位詞 方法&#xff1a; 方法一&#xff1a; 暴力法 1. 分別對s, t排序 2. 遍歷s與t 判斷s[i]!t[i] 返回 false 否則 返回true思路&#xff1a; 注意&#xff1a; 代碼&#xff1a; bool cmp(char a, char b){return a<b;…

網站搭建的基本流程是什么?

網站搭建的基本流程是什么? 我們選擇了白嫖雨云的二級域名 瀏覽器輸入https://www.rainyun.com/z22_ 創建賬號然后選擇一個你喜歡的子域名我建議后綴選擇ates.top的 選擇自定義地址&#xff0c;類型選擇cname 現在要選擇記錄值了&#xff0c;有a&#xff0c;aa&#xff0c;txt…