【Leetcode】隨筆

文章目錄

    • 題目一:路徑總和 II(LeetCode 113)
      • 題目分析:
      • 解題思路:
      • 示例代碼:
      • 代碼解析:
    • 題目二:顏色分類(LeetCode 75)
      • 題目分析:
      • 解題思路:
      • 示例代碼:
      • 代碼解析:
    • 題目三:驗證二叉搜索樹(LeetCode 98)
      • 題目分析:
      • 解題思路:
      • 示例代碼:
      • 代碼解析:

🌈你好呀!我是 山頂風景獨好
🎈歡迎踏入我的博客世界,能與您在此邂逅,真是緣分使然!😊
🌸愿您在此停留的每一刻,都沐浴在輕松愉悅的氛圍中。
📖這里不僅有豐富的知識和趣味橫生的內容等您來探索,更是一個自由交流的平臺,期待您留下獨特的思考與見解。🌟
🚀讓我們一起踏上這段探索與成長的旅程,攜手挖掘更多可能,共同進步!💪?

題目一:路徑總和 II(LeetCode 113)

題目分析:

給你二叉樹的根節點 root 和一個整數目標和 targetSum ,找出所有 從根節點到葉子節點 路徑總和等于給定目標和的路徑。葉子節點是指沒有子節點的節點。例如:輸入root = [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum = 22,輸出[[5,4,11,2],[5,8,4,5]]。

解題思路:

回溯法:通過遞歸遍歷二叉樹,記錄從根節點到當前節點的路徑,當到達葉子節點且路徑和等于目標和時,將路徑加入結果集。
路徑記錄:使用列表存儲當前路徑上的節點值,遞歸進入子節點時添加節點值,回溯時移除節點值。
終止條件:當當前節點為葉子節點(左右子節點均為空)時,判斷路徑和是否等于目標和,若相等則保存路徑。

示例代碼:

# 二叉樹節點定義
class TreeNode:def __init__(self, val=0, left=None, right=None):self.val = valself.left = leftself.right = rightdef pathSum(root, targetSum):result = []def backtrack(node, current_path, current_sum):if not node:return# 將當前節點加入路徑current_path.append(node.val)current_sum += node.val# 到達葉子節點且路徑和等于目標值if not node.left and not node.right:if current_sum == targetSum:result.append(current_path.copy())# 遞歸遍歷左右子樹backtrack(node.left, current_path, current_sum)backtrack(node.right, current_path, current_sum)# 回溯:移除當前節點current_path.pop()backtrack(root, [], 0)return result# 輔助函數:根據列表構建二叉樹(簡化版,僅用于測試)
def build_tree(values):if not values:return Noneroot = TreeNode(values[0])queue = [root]i = 1while queue and i < len(values):node = queue.pop(0)if values[i] is not None:node.left = TreeNode(values[i])queue.append(node.left)i += 1if i < len(values) and values[i] is not None:node.right = TreeNode(values[i])queue.append(node.right)i += 1return root# 測試示例
if __name__ == "__main__":# 構建示例二叉樹:[5,4,8,11,null,13,4,7,2,null,null,5,1]values = [5,4,8,11,None,13,4,7,2,None,None,5,1]root = build_tree(values)targetSum = 22result = pathSum(root, targetSum)print("路徑總和等于{}的路徑:".format(targetSum), result)  # 輸出:[[5,4,11,2],[5,8,4,5]]

代碼解析:

backtrack函數遞歸遍歷二叉樹,參數包括當前節點、當前路徑列表、當前路徑和。
每次進入節點時,將節點值加入路徑并更新路徑和;若為葉子節點且路徑和等于目標值,則復制當前路徑加入結果集。
遞歸遍歷左右子樹后,執行回溯操作(彈出當前節點值),確保路徑列表正確反映上層節點的路徑。
時間復雜度為O(n2)(n為節點數,最壞情況下每個節點都需復制路徑,路徑長度為O(n)),空間復雜度為O(n)(遞歸棧深度和路徑列表長度)。

題目二:顏色分類(LeetCode 75)

題目分析:

給定一個包含紅色、白色和藍色、共n個元素的數組nums,原地對它們進行排序,使得相同顏色的元素相鄰,并按照紅色、白色、藍色順序排列。我們使用整數0、1和2分別表示紅色、白色和藍色。必須在不使用庫內置的排序函數的情況下解決這個問題。例如:輸入nums = [2,0,2,1,1,0],輸出[0,0,1,1,2,2]。

解題思路:

三指針法:使用三個指針(left、current、right)分別追蹤0的右邊界、當前遍歷位置、2的左邊界。
遍歷邏輯:

  • 若current指向0,交換left和current的值,left和current同時右移(確保0在左側);
  • 若current指向1,無需交換,current右移;
  • 若current指向2,交換current和right的值,right左移(確保2在右側),current不動(需重新檢查交換后的值)。
    終止條件:當current > right時,所有元素排序完成。

示例代碼:

def sortColors(nums):"""Do not return anything, modify nums in-place instead."""left = 0  # 0的右邊界(left左側全為0)current = 0  # 當前遍歷位置right = len(nums) - 1  # 2的左邊界(right右側全為2)while current <= right:if nums[current] == 0:# 交換0到左側nums[left], nums[current] = nums[current], nums[left]left += 1current += 1elif nums[current] == 1:# 1無需交換,直接移動currentcurrent += 1else:  # nums[current] == 2# 交換2到右側nums[current], nums[right] = nums[right], nums[current]right -= 1# 測試示例
if __name__ == "__main__":nums = [2,0,2,1,1,0]sortColors(nums)print("排序后的顏色數組:", nums)  # 輸出:[0,0,1,1,2,2]

代碼解析:

三指針分工明確,left確保左側全為0,right確保右側全為2,current負責遍歷中間的1(或待處理元素)。
通過一次遍歷完成排序,所有交換操作均在原數組上進行,無需額外空間。
時間復雜度為O(n)(僅遍歷一次數組),空間復雜度為O(1)(只使用三個指針變量),實現了原地排序。

題目三:驗證二叉搜索樹(LeetCode 98)

題目分析:

給你一個二叉樹的根節點 root ,判斷其是否是一個有效的二叉搜索樹。有效二叉搜索樹定義如下:

  • 節點的左子樹只包含 小于 當前節點的數。
  • 節點的右子樹只包含 大于 當前節點的數。
  • 所有左子樹和右子樹自身必須也是二叉搜索樹。
    例如:輸入root = [2,1,3],輸出true;輸入root = [5,1,4,null,null,3,6],輸出false(4的左子樹包含3,小于5)。

解題思路:

中序遍歷:二叉搜索樹的中序遍歷結果是嚴格遞增的,可通過驗證中序遍歷序列是否遞增來判斷。
遞歸驗證:通過遞歸函數傳遞當前節點值的合法范圍(下界和上界),確保左子樹所有節點值小于當前節點值,右子樹所有節點值大于當前節點值。
邊界處理:使用負無窮和正無窮作為初始上下界,空樹視為有效的二叉搜索樹。

示例代碼:

# 二叉樹節點定義
class TreeNode:def __init__(self, val=0, left=None, right=None):self.val = valself.left = leftself.right = rightdef isValidBST(root):def helper(node, lower, upper):# 空樹是有效的if not node:return True# 當前節點值必須在(lower, upper)范圍內val = node.valif val <= lower or val >= upper:return False# 左子樹的上界為當前節點值,右子樹的下界為當前節點值return helper(node.left, lower, val) and helper(node.right, val, upper)# 初始范圍為(-無窮, +無窮)return helper(root, float('-inf'), float('inf'))# 輔助函數:構建二叉樹(同題目一)
def build_tree(values):if not values:return Noneroot = TreeNode(values[0])queue = [root]i = 1while queue and i < len(values):node = queue.pop(0)if values[i] is not None:node.left = TreeNode(values[i])queue.append(node.left)i += 1if i < len(values) and values[i] is not None:node.right = TreeNode(values[i])queue.append(node.right)i += 1return root# 測試示例
if __name__ == "__main__":# 示例1:[2,1,3]root1 = build_tree([2,1,3])print("是否為有效二叉搜索樹1:", isValidBST(root1))  # 輸出:True# 示例2:[5,1,4,None,None,3,6]root2 = build_tree([5,1,4,None,None,3,6])print("是否為有效二叉搜索樹2:", isValidBST(root2))  # 輸出:False

代碼解析:

helper函數遞歸驗證每個節點是否在合法范圍內:左子樹的所有節點必須小于當前節點值(上界為當前節點值),右子樹的所有節點必須大于當前節點值(下界為當前節點值)。
初始調用時,下界為負無窮,上界為正無窮,確保根節點值合法。
若所有節點都滿足范圍約束,則返回true,否則返回false。
時間復雜度為O(n)(每個節點訪問一次),空間復雜度為O(n)(遞歸棧深度,最壞情況下為鏈狀樹)。


? 這就是今天要分享給大家的全部內容了,我們下期再見!😊
🏠 我在CSDN等你哦!我的主頁😍

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

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

相關文章

深入 FastMCP 源碼:認識 tool()、resource() 和 prompt() 裝飾器

在使用 FastMCP 開發 MCP 服務器時經常會用到 mcp.tool() 等裝飾器。雖然它們用起來很簡單&#xff0c;但當作黑匣子總讓人感覺"不得勁"。接下來我們將深入相關的源碼實現&#xff0c;別擔心&#xff0c;不會鉆沒有意義的“兔子洞”&#xff0c;你可以通過這篇文章了…

Spring Boot 2.0 升級至 3.5 JDK 1.8 升級至 17 全面指南

一、版本升級背景升級動機 Spring Boot 2.0 到 3.5 的重大更新&#xff08;如Jakarta EE 9包路徑變更、GraalVM支持等&#xff09;JDK 1.8 到 17 的語言特性升級&#xff08;如sealed class、record等&#xff09;安全性與性能優化需求升級目標 兼容性驗證依賴庫版本適配代碼兼…

級數學習筆記

級數學習筆記 一、數學基礎 1. 數項級數&#xff08;Number Series&#xff09; 數項級數是指形如&#xff1a; ∑(n1 to ∞) a? a? a? a? ...的無窮和。 1.1 收斂性判別法 比較判別法比值判別法根值判別法積分判別法萊布尼茨判別法&#xff08;交錯級數&#xff09; 2…

Linux811 YUM;SHELL:if else fi,for

vsftpdok [rootweb ~]# vim vsftpdok.sh 您在 /var/spool/mail/root 中有新郵件 [rootweb ~]# cat vsftpdok.sh rpm -ql vsftpd >/dev/null 2>&1 if [ $? -eq 0 ];then echo "OK" else yum install vsftpd -y if [ $? -eq 0 ];then echo "install o…

運維學習Day20——MariaDB數據庫管理

文章目錄MariaDB 數據庫管理介紹 MariaDB數據庫介紹數據庫種類關系數據庫MariaDB 介紹部署 MariaDB安裝 MariaDB加固 MariaDB連接 MariaDB配置 MariaDBMariaDB 中 SQL描述 SQL連接數據庫數據庫操作查詢數據庫列表使用數據庫創建數據庫刪除數據庫表操作環境準備查詢表查詢表列表…

itertools:迭代器函數

文章目錄一、合并和分解迭代器1、chain&#xff1a;首尾相接2、zip / zip_longest&#xff1a;對齊取數3、islice&#xff1a;切片4、tee&#xff1a;分裂二、轉換輸入1、map / starmap&#xff1a;函數映射三、生成新值1、count&#xff1a;生成連續整數2、repeat&#xff1a;…

【AI論文】序列標注任務廣義化研究(SFT廣義化):基于獎勵修正的強化學習視角

摘要&#xff1a;我們針對大語言模型&#xff08;Large Language Model&#xff0c;LLM&#xff09;的監督微調&#xff08;Supervised Fine-Tuning&#xff0c;SFT&#xff09;提出了一種簡單但具有理論依據的改進方法&#xff0c;以解決其與強化學習&#xff08;Reinforcemen…

(已解決)Mac 終端上配置代理

說明&#xff1a;為了便于理解&#xff0c;本文描述略顯“抽象”與“潦草”&#xff0c;為了過審&#xff0c;僅供學習交流使用。&#x1f680; 簡潔流程版啟動工具 點擊圖標&#xff0c;復制它給出的終端命令將這段內容粘貼進你的配置文件中&#xff08;~/.zshrc 或 ~/.bash_p…

Anti-Aliasing/Mip-NeRF/Zip-NeRF/multi-scale representation

前言 CSDN的文章寫太多&#xff0c;都不記得之前寫的有什么了&#xff0c;但習慣了在這里記錄&#xff0c;先寫上吧。關于multi-scale representation又是看著忘著&#xff0c;還是寫下點什么比較啊。時看時新&#xff0c;還是想吐槽自己看論文太不認真了。下面直接按照文章順序…

板塊三章節3——NFS 服務器

NFS 服務器 NFS 服務介紹 NFS 是Network File System的縮寫&#xff0c;即網絡文件系統&#xff0c;最早由Sun公司開發&#xff0c;**用來在UNIX&Linux系統間實現磁盤文件共享的一種方法。**它的主要功能是通過網絡讓不同的主機系統之間可以共享文件或目錄。NFS客戶端&…

數學建模——最大最小化模型

1.概念最大最小化模型&#xff08;Maximin Model&#xff09;是一種優化方法&#xff0c;旨在最大化最壞情況下的收益或最小化最壞情況下的損失。常見的現實問題有&#xff1a;求最大值的最小化問題最大風險的最低限度最小化最壞情況下的損失等2.一般數學模型 (找最大值里面最小…

【JAVA】使用系統音頻設置播放音頻

代碼直接可以運行 import javax.sound.sampled.*; import java.io.File; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.nio.charset.StandardCharsets;public class SystemDefaultAudioPlayer {// 強制使用的通用音頻格式private st…

[CSP-J 2021] 小熊的果籃

題目 12代碼 #include <bits/stdc.h> using namespace std; const int N2e55; struct node{int pre,//上一個水果塊(對于水果就是上個水果)l,//塊開始的序號&#xff0c;左邊界 d,//塊類型&#xff0c;0/1id,//水果序號 r,//塊結束的序號&#xff0c;右邊界 next;//下一塊…

【C++】STL二叉搜索樹——map與set容器的基礎結構

目錄 前言 1.二叉搜索樹的概念 1.1基本結構 1.2性能分析 2.二叉搜索樹的實現 2.1創建 2.2插入 2.3查找與遍歷 2.4刪除 3.二叉搜索樹類代碼 前言 C中STL的map與set容器廣泛應用于實踐過程中&#xff0c;本文將詳細分析容器最基礎的二叉搜索樹結構&#xff0c;為后續map…

基于Spring Boot和SSE的實時消息推送系統

一、SSE技術深度解析 1.1 協議工作原理 #mermaid-svg-u7ZBlEsXcn68R5a8 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-u7ZBlEsXcn68R5a8 .error-icon{fill:#552222;}#mermaid-svg-u7ZBlEsXcn68R5a8 .error-text{fi…

Day 40 訓練和測試的規范寫法

知識點回顧&#xff1a; 彩色和灰度圖片測試和訓練的規范寫法&#xff1a;封裝在函數中展平操作&#xff1a;除第一個維度batchsize外全部展平dropout操作&#xff1a;訓練階段隨機丟棄神經元&#xff0c;測試階段eval模式關閉dropout 作業&#xff1a;仔細學習下測試和訓練代…

分析代碼并回答問題

代碼 <template><div>Counter: {{ counter }}</div><div>Double Counter: {{ doubleCounter }}</div> </template><script setup lang"ts"> import { ref, computed } from "vue";const counter ref(0);const …

在macOS上掃描192.168.1.0/24子網的所有IP地址

在macOS上掃描192.168.1.0/24子網的所有IP地址&#xff0c;可以通過終端命令實現。以下是幾種常用方法&#xff1a; 使用ping命令循環掃描 打開終端執行以下腳本&#xff0c;會逐個ping測試192.168.1.1到192.168.1.254的地址&#xff0c;并過濾出有響應的IP&#xff1a; for i …

Java基礎05——類型轉換(本文為個人學習筆記,內容整理自嗶哩嗶哩UP主【遇見狂神說】的公開課程。 > 所有知識點歸屬原作者,僅作非商業用途分享)

Java基礎05——類型轉換 類型轉換 由于Java是強類型語言&#xff0c;所以要進行有些運算的時候&#xff0c;需要用到類型轉換。 如&#xff1a;byte(占1個字節)&#xff0c;short(占2個字節)&#xff0c;char(占2個字節)→int(4個字節)→long(占8個字節)→float(占4個字節)→do…

mysql基礎(二)五分鐘掌握全量與增量備份

全量備份 Linux環境 數據備份 數據庫的備份與恢復有多中方法&#xff0c;通過mysql自帶的mysqldump工具可對數據庫進行備份。語法&#xff1a; mysqldump -u username -p password --databases db_name > file_name .sql說明&#xff1a; -u參數指定用戶名&#xff0c;usern…