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

LeetCode題目:

  • 654. 最大二叉樹
  • 617. 合并二叉樹
  • 700. 二叉搜索樹中的搜索
  • 98. 驗證二叉搜索樹
  • 2843. 統計對稱整數的數目

其他:

今日總結
往期打卡


654. 最大二叉樹

跳轉: 654. 最大二叉樹

學習: 代碼隨想錄公開講解

問題:

給定一個不重復的整數數組 nums最大二叉樹 可以用下面的算法從 nums 遞歸地構建:

  1. 創建一個根節點,其值為 nums 中的最大值。
  2. 遞歸地在最大值 左邊子數組前綴上 構建左子樹。
  3. 遞歸地在最大值 右邊子數組后綴上 構建右子樹。

在這里插入圖片描述

返回 nums 構建的 *最大二叉樹*

思路:

這道題要求構造二叉樹,使用前序遍歷先構造自身再構造子樹比較符合直覺,當然,先構造子節點再構造父節點后序遍歷也是沒有問題的,不過需要先存儲子節點再構造父節點,比較麻煩.當然,用中序遍歷也是,只需要先處理到左根,再創建節點,再綁定右子樹即可.所以說前中后序只是創建節點的位置不同.
但這題用層序遍歷就不是很合適,因為數組不是很好劃分,要存儲全部路徑的邊界狀態.
因為需要獲取兩個子節點再操作本節點,所以使用迭代法比較麻煩.

復雜度:

  • 時間復雜度: O ( n ) O(n) O(n)
  • 空間復雜度: O ( n ) O(n) O(n)

代碼(前序遞歸實現):

class Solution {TreeNode getTree(int[] nums,int l,int r){if(l>=r) return null;if(r-l==1) return new TreeNode(nums[l]);int index = l;int max = 0;for(int i=l;i<r;i++){if(nums[i]>max){max = nums[i];index = i;}}TreeNode root = new TreeNode(max);root.left = getTree(nums,l,index);root.right = getTree(nums,index+1,r);return root;}public TreeNode constructMaximumBinaryTree(int[] nums) {return getTree(nums,0,nums.length);}
}

617. 合并二叉樹

跳轉: 617. 合并二叉樹

學習: 代碼隨想錄公開講解

問題:

給你兩棵二叉樹: root1root2

想象一下,當你將其中一棵覆蓋到另一棵之上時,兩棵樹上的一些節點將會重疊(而另一些不會)。你需要將這兩棵樹合并成一棵新二叉樹。合并的規則是:如果兩個節點重疊,那么將這兩個節點的值相加作為合并后節點的新值;否則,不為 null 的節點將直接作為新二叉樹的節點。

返回合并后的二叉樹。

注意: 合并過程必須從兩個樹的根節點開始。

在這里插入圖片描述

思路:

兩棵樹一起遍歷,如果都不為null就合并,一方為null就返回另一方.
這里直接前序遍歷

復雜度:

  • 時間復雜度: O ( n ) O(n) O(n)
  • 空間復雜度: O ( l o g n ) O(logn) O(logn)

代碼:

class Solution {public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {if(root1==null) return root2;if(root2==null) return root1;TreeNode root = new TreeNode(root1.val+root2.val);root.left = mergeTrees(root1.left,root2.left);root.right = mergeTrees(root1.right,root2.right);return root;}
}

700. 二叉搜索樹中的搜索

跳轉: 700. 二叉搜索樹中的搜索

學習: 代碼隨想錄公開講解

問題:

給定二叉搜索樹(BST)的根節點 root 和一個整數值 val

你需要在 BST 中找到節點值等于 val 的節點。 返回以該節點為根的子樹。 如果節點不存在,則返回 null

思路:

這里直接利用二叉搜索樹的性質選擇遞歸方向即可

有效 二叉搜索樹定義如下:

  • 節點的左子樹只包含 小于 當前節點的數。
  • 節點的右子樹只包含 大于 當前節點的數。
  • 所有左子樹和右子樹自身必須也是二叉搜索樹。

復雜度:

  • 時間復雜度: O ( n ) O(n) O(n)
  • 空間復雜度: O ( l o g n ) O(logn) O(logn)

代碼:

class Solution {public TreeNode searchBST(TreeNode root, int val) {if(root==null) return null;if(root.val==val) return root;if(root.val>val) return searchBST(root.left,val);return searchBST(root.right,val);}
}

98. 驗證二叉搜索樹

跳轉: 98. 驗證二叉搜索樹

學習: 代碼隨想錄公開講解

問題:

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

有效 二叉搜索樹定義如下:

  • 節點的左子樹只包含 小于 當前節點的數。
  • 節點的右子樹只包含 大于 當前節點的數。
  • 所有左子樹和右子樹自身必須也是二叉搜索樹。

思路:

右子樹中所有節點都大于當前節點,左子樹中所有節點都小于當前節點,基于此,可以使用邊界收縮法,判斷子節點是否在邊界內

當然,二叉搜索樹有一個很重要的性質,那就是中序遍歷下單調遞增.所以如果能想到這條性質可以降低編碼復雜度,并提升代碼效率.

復雜度:

  • 時間復雜度: O ( n ) O(n) O(n)
  • 空間復雜度: O ( n ) O(n) O(n)

代碼(中序遍歷):

class Solution {long pre = Long.MIN_VALUE;public boolean isValidBST(TreeNode root) {if(root==null) return true;if(!isValidBST(root.left)) return false;if(root.val<=pre) return false;pre = root.val;return isValidBST(root.right);}
}

代碼(邊界收縮):

class Solution {boolean handle(TreeNode root,long lBorder,long rBorder){if (root == null)return true;boolean a, b;a = true;b = true;if (root.left != null)if (root.left.val>lBorder&&root.left.val<root.val)a = handle(root.left,lBorder,root.val);elsereturn false;if (root.right != null)if (root.right.val>root.val&&root.right.val<rBorder)b = handle(root.right,root.val,rBorder);elsereturn false;return a&b;}public boolean isValidBST(TreeNode root) {return handle(root,Long.MIN_VALUE,Long.MAX_VALUE);}
}

2843. 統計對稱整數的數目

跳轉: 2843. 統計對稱整數的數目

問題

給你兩個正整數 lowhigh

對于一個由 2 * n 位數字組成的整數 x ,如果其前 n 位數字之和與后 n 位數字之和相等,則認為這個數字是一個對稱整數。

返回在 [low, high] 范圍內的 對稱整數的數目

思路:

找特殊數,最簡單的方法就是把所有可能用到的特殊數都記下來,然后枚舉特殊數進行判斷.當然范圍較小的情況下遍歷范圍里的數其實也差不多
當然,也可以直接枚舉每位判斷

復雜度:

  • 時間復雜度: O ( n ) O(n) O(n)
  • 空間復雜度: O ( n ) O(n) O(n)

代碼(哈希字典1):

class Solution {public int countSymmetricIntegers(int low, int high) {int[] hash = new int[1000];int l = 0;for(int i=1;i<10;i++){hash[l++] = i+10*i; }for(int i=1;i<10;i++){for(int j=0;j<10;j++){for(int k=0;k<10&&k<=i+j;k++){if(i+j-k>=10) continue;hash[l++]=(i*1000+j*100+k*10+(i+j-k));}}}int ans = 0;for(int i:hash){if(i<low) continue;if(i>high||i==0) break;ans++;}return ans;}
}

代碼(哈希字典2):

class Solution {public int countSymmetricIntegers(int low, int high) {int[] hash = new int[10001];for(int i=1;i<10;i++){hash[i+10*i]++; }for(int i=1;i<10;i++){for(int j=0;j<10;j++){for(int k=0;k<10&&k<=i+j;k++){if(i+j-k>=10) continue;hash[(i*1000+j*100+k*10+(i+j-k))]++;}}}int ans = 0;for(int i = low;i<=high;i++){if(hash[i]==1) ans++;}return ans;}
}

總結

今天主要是復習了二叉搜索樹相關的概念.

往期打卡

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

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

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

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

代碼隨想錄算法訓練營周末二

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

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

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

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

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

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

代碼隨想錄算法訓練營周末一

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

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

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

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

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

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

相關文章

[GN] Uart協議解碼器源碼各個方法

系列文章目錄 sigrokdecode 模塊學習指南 — 準備階段 通訊協議 - Uart sigrokdecode 模塊 UART協議解碼器源碼解析 Uart協議解碼器源碼各個方法 文章目錄 系列文章目錄引入庫parity_ok注解類型枚舉options參數annotations 注解annotation_rows 注解分組接收&#xff08;RX&a…

技術分享|iTOP-RK3588開發板Ubuntu20系統旋轉屏幕方案

iTOP-3588開發板采用瑞芯微RK3588處理器&#xff0c;是全新一代AloT高端應用芯片&#xff0c;采用8nmLP制程&#xff0c;搭載八核64位CPU&#xff0c;四核Cortex-A76和四核Cortex-A55架構&#xff0c;主頻高達2.4GHz。是一款可用于互聯網設備和其它數字多媒體的高性能產品。 在…

Unity IL2CPP內存泄漏追蹤方案(基于Memory Profiler)技術詳解

一、IL2CPP內存管理特性與泄漏根源 1. IL2CPP內存架構特點 內存區域管理方式常見泄漏類型托管堆(Managed)GC自動回收靜態引用/事件訂閱未取消原生堆(Native)手動管理非托管資源未釋放橋接層GCHandle/PInvoke跨語言引用未正確釋放 對惹&#xff0c;這里有一個游戲開發交流小組…

消融實驗_草稿

五列數據 \begin{table}[htbp]\caption{Performance Comparison of Standalone KD Variants vs MIRKD-enhanced Variants on ACNE04 Dataset\label{AblationKD}}\centering\renewcommand{\arraystretch}{1.2}\scriptsize\begin{tabularx}{\linewidth}{{}l *{3}{>{\centering…

面向對象高級(1)

文章目錄 final認識final關鍵字修飾類&#xff1a;修飾方法&#xff1a;修飾變量final修飾變量的注意事項 常量 單例類什么是設計模式&#xff1f;單例怎么寫?餓漢式單例的特點是什么&#xff1f;單例有啥應用場景&#xff0c;有啥好處&#xff1f;懶漢式單例類。 枚舉類認識枚…

不用額外下載jar包,idea快速查看使用的組件源碼

以nacos為例子&#xff0c;在idea中引入了nacos依賴&#xff0c;就可以查看源碼了。 2. idea選擇open&#xff08;不關閉項目直接選擇file-open也可以&#xff09;, 在maven的倉庫里找到對應的包&#xff0c;打開 2.idea中選擇 jar包&#xff0c;選擇 add as library 3.這樣j…

小白學習java第12天:IO流之緩沖流

1.IO緩沖流&#xff1a; 之前我們學習的都是原始流&#xff08;FileInputStream字節輸入流、FileOutputStream字節輸出流、FIleReader字符輸入流、FIleWriter字符輸出流&#xff09;其實我們可以知道對于這些其實性能都不是很好&#xff0c;要么太慢一個一個&#xff0c;要么就…

高速電路設計概述

1.1 低速設計和高速設計的例子 本節通過一個簡單的例子&#xff0c;探討高速電路設計相對于低速電路設計需要考慮哪些不同的問題。希望讀者通過本例&#xff0c;對高速電路設計建立一個表象的認識。至于高速電路設計中各方面的設計要點&#xff0c;將在后續章節展開詳細的討論…

MySQL8.0.31安裝教程,附pdf資料和壓縮包文件

參考資料&#xff1a;黑馬程序員 一、下載 點開下面的鏈接&#xff1a;https://dev.mysql.com/downloads/mysql/ 點擊Download 就可以下載對應的安裝包了, 安裝包如下: 我用夸克網盤分享了「mysql」&#xff0c;鏈接&#xff1a;https://pan.quark.cn/s/ab7b7acd572b 二、解…

在Java項目中,引入【全局異常處理器】

目錄 一.為什么引入全局異常處理器&#xff08;目前項目碰到了什么問題&#xff09;&#xff1f; 1.問題描述 2.與預期的差別 3.解決方案 二.解決上述問題 1.定義【業務異常類】 2.在serviceImpl層&#xff0c;手動拋出【違反唯一性約束】這個異常 3.定義【全局異常處理…

newspaper公共庫獲取每個 URL 對應的新聞內容,并將提取的新聞正文保存到一個文件中

示例代碼&#xff1a; from newspaper import Article from newspaper import Config import json from tqdm import tqdm import os import requestswith open(datasource/api/news_api.json, r) as file:data json.load(file)print(len(data)) save_path datasource/sourc…

前端核心知識:Vue 3 編程的 10 個實用技巧

文章目錄 1. **使用 ref 和 reactive 管理響應式數據**原理解析代碼示例注意事項 2. **組合式 API&#xff08;Composition API&#xff09;**原理解析代碼示例優勢 3. **使用 watch 和 watchEffect 監聽數據變化**原理解析代碼示例注意事項 4. **使用 provide 和 inject 實現跨…

【Web API系列】XMLHttpRequest API和Fetch API深入理解與應用指南

前言 在現代Web開發中&#xff0c;客戶端與服務器之間的異步通信是構建動態應用的核心能力。無論是傳統的AJAX技術&#xff08;基于XMLHttpRequest&#xff09;還是現代的Fetch API&#xff0c;它們都為實現這一目標提供了關鍵支持。本文將從底層原理、核心功能、代碼實踐到實…

[特殊字符] Spring Boot 日志系統入門博客大綱(適合初學者)

一、前言 &#x1f4cc; 為什么日志在項目中如此重要&#xff1f; 在開發和維護一個后端系統時&#xff0c;日志就像程序運行時的“黑匣子”&#xff0c;幫我們記錄系統的各種行為和異常。一份良好的日志&#xff0c;不僅能幫助我們快速定位問題&#xff0c;還能在以下場景中…

IP協議之IP,ICMP協議

1.因特網中的主要協議是TCP/IP&#xff0c;Interneet協議也叫TCP/IP協議簇 2.ip地址用點分十進制表示&#xff0c;由32位的二進制表示&#xff0c;兩部分組成&#xff1a;網絡標識主機標識 3.IP地址分類; A:0.0.0.0-127.255.255.255 B&#xff1a;128.0.0.0-191.255.255.25…

GPIO_ReadInputData和GPIO_ReadInputDataBit區別

目錄 1、GPIO_ReadInputData: 2、GPIO_ReadInputDataBit: 總結 GPIO_ReadInputData 和 GPIO_ReadInputDataBit 是兩個函數&#xff0c;通常用于讀取微控制器GPIO&#xff08;通用輸入輸出&#xff09;引腳的輸入狀態&#xff0c;特別是在STM32系列微控制器中。它們之間的主要…

洛古B4158 [BCSP-X 2024 12 月小學高年級組] 質數補全(線性篩/dfs)

B4158 [BCSP-X 2024 12 月小學高年級組] 質數補全 - 洛谷 思路1:線性篩,字符串匹配,枚舉 質數篩選 要解決這個問題&#xff0c;首先得找出指定范圍內&#xff08;這里是 1 到 10000000&#xff09;的所有質數。常用的質數篩選算法有埃拉托斯特尼篩法&#xff08;埃氏篩&#…

一周學會Pandas2 Python數據處理與分析-Pandas2讀取Excel

鋒哥原創的Pandas2 Python數據處理與分析 視頻教程&#xff1a; 2025版 Pandas2 Python數據處理與分析 視頻教程(無廢話版) 玩命更新中~_嗶哩嗶哩_bilibili Excel格式文件是辦公使用和處理最多的文件格式之一&#xff0c;相比CSV文件&#xff0c;Excel是有樣式的。Pandas2提…

NVIDIA H100 vs A100:新一代GPU架構性能對比分析

一、核心架構演進對比 ?Ampere架構&#xff08;A100&#xff09;?采用臺積電7nm工藝&#xff0c;集成540億晶體管&#xff0c;配備6,912個CUDA核心和432個第三代Tensor Core&#xff0c;支持FP16、TF32和INT8精度計算。其顯存子系統采用HBM2e技術&#xff0c;80GB版本帶寬可…

保護PCBA的不同方法:噴三防漆 vs 鍍膜

PCBA&#xff08;印刷電路板組件&#xff09;的防護工藝中&#xff0c;噴三防漆和鍍膜&#xff08;如Parylene氣相沉積&#xff09;是兩種常見技 術。它們在防護目的上類似&#xff0c;但在具體實現方式和應用場景上有顯著差異。以下從外觀、工藝、性 能、物理性質和成本五個…