給定一個沒有重復元素的數組,寫出生成這個數組的MaxTree的函數

題目:

給定一個沒有重復元素的數組arr,寫出生成這個數組的MaxTree的 函數,要求如果數組長度為N,則時間復雜度為O(N)、額外空間復雜度 為O(N)

一個數組的MaxTree定義如下

數組必須沒有重復元素。

● MaxTree是一棵二叉樹,數組的每一個值對應一個二叉樹節 點。

包括MaxTree樹在內且在其中的每一棵子樹上,值最大的節點 都是樹的頭

解題思路:

因為MaxTree要求每個子樹的最大值都是根節點。對于任意一個節點,它的父節點必須是比它大的數,而且這個父節點還要盡可能小(這樣才不會影響它成為局部子樹的根)。同時,左右子樹分別是該節點左右兩側小于它的數構成的子樹。

我們可以利用每個元素左右兩邊第一個比它大的數來構建這棵樹。具體方法如下:

1. 對于數組中的每一個元素,找出它左邊第一個比它大的數和右邊第一個比它大的數。

2. 然后,每個元素的父節點應該是它左右兩邊第一個比它大的數中較小的那個。如果選較大的那個,那么另一個方向就會存在比父節點更大的數,不符合MaxTree的定義;如果左右都沒有比它大的數,那么它就是根節點。

步驟:

1. 使用單調棧(遞減棧)來快速找到每個元素左右兩邊第一個比它大的數。 - 從左到右遍歷:得到每個元素左邊第一個比它大的數(如果左邊沒有,則為null)。 - 從右到左遍歷:得到每個元素右邊第一個比它大的數(如果右邊沒有,則為null)。

2. 構建節點:為數組中的每個元素創建一個節點。

3. 確定父節點: - 對于每個元素,比較其左邊第一個比它大的數(記為leftGreater)和右邊第一個比它大的數(記為rightGreater): - 如果leftGreater和rightGreater都不存在,則該節點為根節點。 - 如果只有一個存在,則該存在的節點就是父節點。 - 如果兩個都存在,選擇其中較小的那個作為父節點。

4. 連接節點:將當前節點作為其父節點的左孩子或右孩子(如果父節點的左孩子為空則放左孩子,否則放右孩子)

代碼實現:

import java.util.Stack;public class MaxTreeBuilder {static class Node {int value;Node left;Node right;public Node(int value) {this.value = value;}}public static Node buildMaxTree(int[] arr) {if (arr == null || arr.length == 0) return null;int n = arr.length;// 存儲左側第一個比當前元素大的索引int[] leftGreater = new int[n];// 存儲右側第一個比當前元素大的索引int[] rightGreater = new int[n];// 初始化邊界數組for (int i = 0; i < n; i++) {leftGreater[i] = -1;  // -1表示不存在rightGreater[i] = -1;}// 單調棧計算leftGreaterStack<Integer> stack = new Stack<>();for (int i = 0; i < n; i++) {while (!stack.isEmpty() && arr[stack.peek()] < arr[i]) {stack.pop();}if (!stack.isEmpty()) {leftGreater[i] = stack.peek();}stack.push(i);}// 清空棧并計算rightGreaterstack.clear();for (int i = n - 1; i >= 0; i--) {while (!stack.isEmpty() && arr[stack.peek()] < arr[i]) {stack.pop();}if (!stack.isEmpty()) {rightGreater[i] = stack.peek();}stack.push(i);}// 創建節點數組Node[] nodes = new Node[n];for (int i = 0; i < n; i++) {nodes[i] = new Node(arr[i]);}// 構建父節點關系Node root = null;for (int i = 0; i < n; i++) {int leftIndex = leftGreater[i];int rightIndex = rightGreater[i];// 確定父節點索引int parentIndex = -1;if (leftIndex == -1 && rightIndex == -1) {root = nodes[i];  // 根節點continue;} else if (leftIndex == -1) {parentIndex = rightIndex;} else if (rightIndex == -1) {parentIndex = leftIndex;} else {// 選擇值較小的作為父節點parentIndex = (arr[leftIndex] < arr[rightIndex]) ? leftIndex : rightIndex;}// 連接節點if (i < parentIndex) {nodes[parentIndex].left = nodes[i];} else {nodes[parentIndex].right = nodes[i];}}return root;}// 打印樹結構(前序遍歷用于驗證)public static void printTree(Node root) {if (root == null) return;System.out.print(root.value + " ");printTree(root.left);printTree(root.right);}public static void main(String[] args) {int[] arr = {3, 4, 5, 1, 2};Node root = buildMaxTree(arr);System.out.println("MaxTree 前序遍歷:");printTree(root);// 預期結構:5(4(3, null), 2(1, null))// 前序遍歷:5 4 3 2 1}
}

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

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

相關文章

iOS 抓包實戰:時間戳偏差導致的數據同步異常排查記錄

“這條數據不是我填的”“我的更新被覆蓋了”“兩個設備顯示不一致”——這些是產品上線后最令人頭疼的反饋。 最近我們在一次用戶同步問題排查中&#xff0c;發現表面是“數據丟失”問題&#xff0c;實則是多端數據提交時間戳處理不一致&#xff0c;導致后臺認為老數據為新&a…

一款支持多日志器、多級別、多落地方式的同異步日志系統

文章目錄 簡介項目特點項目實現基礎功能模塊實現文件操作以及日期時間獲取日志等級日志信息描述 異步功能模塊實現緩沖區實現異步線程實現 核心功能模塊實現日志格式解析落地操作實現日志器實現 測試測試環境測試參數測試結果性能分析 附件 簡介 在現代軟件開發與系統運維領域…

加固筆記本在戶外勘探行業的應用:探索與科技的融合

在自然資源勘探、地質調查、石油天然氣開發、礦產資源測繪等戶外勘探行業中&#xff0c;作業環境常常復雜多變&#xff1a;風沙漫天的戈壁、雨雪交加的山區、濕熱潮濕的叢林&#xff0c;甚至是極寒與高溫并存的極端氣候條件。面對這些挑戰&#xff0c;普通的辦公設備早已無法勝…

MySQL 連接指定端口后,為什么實際仍是 3306?

文章目錄 MySQL 連接指定端口后&#xff0c;為什么實際仍是 3306&#xff1f;問題現象復現原因分析沒有指定 -h&#xff0c;默認走的是本地 Unix Socket多實例環境中未顯式指定目標地址 正確的連接方法方法一&#xff1a;添加 -h 127.0.0.1方法二&#xff1a;添加 --protocolTC…

【Android當用戶兩次打斷息屏操作后,屏幕將會在10分鐘內無法熄滅并持續點亮(關閉Android13新增的dim功能)】

UndimDetectorWakeLock持鎖導致屏幕不滅問題處理SOP 問題描述 在Android T版本中&#xff0c;系統新增了SCREEN_BRIGHT_WAKE_LOCK&#xff08;UndimDetectorWakeLock&#xff09;機制。當設備處于低亮度&#xff08;dim&#xff09;狀態時&#xff0c;用戶兩次打斷屏幕熄滅操…

Tailwind CSS自定義用法

文章目錄 前言? 一、集成 Tailwind CSS 到 React 項目1. 安裝依賴2. 配置 tailwind.config.js3. 創建全局樣式文件&#xff08;如 src/index.css&#xff09;tailwind base;tailwind components;tailwind utilities; 4. 在 main.tsx 或 main.jsx 中引入樣式 ? 二、自定義樣式…

linux面試常考

常用指令 常見題

Spring Boot 2.2.6調用DeepSeek API并通過SSE將流式響應推送給前端的完整實現

1. 添加依賴 (pom.xml) <dependencies><!-- Spring Boot Web --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- SSE 支持 --><depe…

LM1117-ADJ 簡單介紹

LM1117-ADJ是一款可調輸出電壓的低壓差線性穩壓器&#xff08;LDO&#xff09;&#xff0c;具有以下關鍵特性和應用要點&#xff1a; 核心特性 可調輸出電壓 通過外部分壓電阻&#xff08;R1和R2&#xff09;調節輸出電壓&#xff0c;范圍為1.25V至13.8V。輸出電壓公式&#…

知名流體控制解決方案供應商“永盛科技”與商派ShopeX達成B2B商城項目合作

2025年6月&#xff0c;全球知名的工業流體控制解決方案服務商——永盛科技&#xff08;股票&#xff1a;874497&#xff09;&#xff0c;與商派ShopeX正式達成B2B商城項目合作。 此次合作將共同推動永盛科技B2B業務的數字化變革&#xff0c;提高B2B業務運營效率&#xff0c;同…

jvm簡單八股

1、jvm中內存分為那幾個區域&#xff0c;1.7和1.8 jvm 中主要有 程序計數器、虛擬機棧、本地方法棧、堆、方法區、直接內存。 線程私有的有&#xff1a;程序計數器、虛擬機棧、本地方法棧 線程共有的有&#xff1a;堆、方法區、直接內存 堆空間又可以分為&#xff1a;新時代、…

contOS7安裝docker命令及yum源更換為國內源

docker介紹 Docker是一個開源的容器化平臺,通過將應用程序及其依賴打包成輕量級、可移植的容器,確保開發、測試和部署環境的一致性。Docker的核心概念包括容器、鏡像、Dockerfile和鏡像倉庫。容器是輕量級的虛擬化技術,共享宿主機內核但保持獨立運行環境,啟動快且資源占用少…

SpringBoot集成Redis-6.x版本流程

SpringBoot集成Redis是我們常見的功能&#xff0c;今天我們分享一下&#xff1a; 前言&#xff1a; 1、pom包引用 <!-- Redis Starter (默認使用 Lettuce) --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boo…

zookeeper Curator(3):Watch事件監聽

文章目錄 Curator API 常用操作 Watch事件監聽NodeCachePathChildrenCacheTreeCache 本章代碼已分享至Gitee: https://gitee.com/lengcz/curator01 Curator API 常用操作 Watch事件監聽 zookeeper 允許用戶在指定節點上注冊一些Watcher &#xff0c;并且在一些特定事件觸發的時…

多模態融合相機L3CAM

多模態融合相機L3CAM L3CAM是Beamagine公司推出的多模態傳感器融合技術&#xff0c;結合了激光雷達&#xff08;LiDAR&#xff09;和可見光攝像頭&#xff0c;旨在為自動駕駛、工業機器人和其他需要精確環境感知的應用場景提供高效、安全的解決方案。 L3CAM技術參數 L3CAM結合…

結構化思維

前言 洞悉分析方法論 系統解決管理問題 1 構建問題分析框架 1.1 摘要 &#xff08;1&#xff09;何謂問題分析和解決&#xff1f; &#xff08;2&#xff09;問題分析和解決的基本原則 1.2 什么是問題分析與決策&#xff1f; 1.3 問題解決者需要具備的四種能力 &#xf…

什么是數字簽名(ECDSA)?

數字簽名是區塊鏈、數字身份認證和安全通信的核心技術之一&#xff0c;ECDSA&#xff08;橢圓曲線數字簽名算法&#xff09;是目前最常見、最主流的數字簽名算法之一&#xff0c;尤其在區塊鏈系統&#xff08;如比特幣、以太坊、EOS&#xff09;中廣泛應用。 一、什么是數字簽名…

深入剖析AI大模型:Dify的介紹

今天介紹的內容&#xff0c;跟大模型開發還是息息相關的。俗話說&#xff1a;有人的地方就是江湖&#xff01;對于我們技術其實也一樣&#xff0c;一個新技術的出現&#xff0c;自然會衍生出相應的生態圈。今天的文字只是介紹&#xff0c;以后會有專門的實操篇&#xff0c;主要…

Open VSX Registry關鍵漏洞使攻擊者可完全控制Visual Studio Code擴展市場

網絡安全研究人員近日披露了 Open VSX Registry&#xff08;"open-vsx[.]org"&#xff09;中存在的一個關鍵漏洞。若被成功利用&#xff0c;攻擊者可能完全控制整個 Visual Studio Code 擴展市場&#xff0c;造成嚴重的供應鏈風險。 漏洞詳情與潛在影響 Koi Securi…

Python從入門到高手9.1節-Python中的字典類型

目錄 9.1.1 理解字典類型 9.1.2 字典的類型名 9.1.3 字典的定義 9.1.4 字典的主要性質 9.1.5 好好學習&#xff0c;天天向上 9.1.1 理解字典類型 在日常生活中&#xff0c;我們常常會接觸到“字典”這種數據類型&#xff0c;例如一本書籍的目錄結構&#xff0c;在目錄結構…