[LeetCode]每日溫度

題目鏈接

每日溫度

題目描述

?

思路解析 :單調棧

單調棧介紹:

單調棧是一種特殊的棧數據結構,其核心特性是棧內元素始終保持單調遞增或單調遞減的順序。這種特性使其在解決「尋找下一個更大 / 更小元素」「區間最值」等問題時具有極高效率,時間復雜度通常為 O (n)。

一、單調棧的核心特性

1。單調性:棧內元素按照某種規則(遞增或遞減)嚴格排序

  • 單調遞增棧:棧頂元素 ≥ 棧底元素(從棧頂到棧底遞增)
  • 單調遞減棧:棧頂元素 ≤ 棧底元素(從棧頂到棧底遞減)

2.操作規則:

  • 新元素入棧前,先彈出所有破壞單調性的棧頂元素
  • 確保入棧后仍保持原有單調性
  • 彈出的元素通常能找到「第一個符合條件的元素」

二、典型應用場景

  1. 尋找數組中每個元素的「下一個更大元素」
  2. 尋找數組中每個元素的「下一個更小元素」
  3. 計算柱狀圖中能接多少雨水
  4. 計算最大矩形面積
  5. 解決「每日溫度」問題(如前文代碼)

三、工作原理演示?

下面分別用單調遞增棧單調遞減棧處理數組[1,4,3,5,5,2,3,6],并展示處理過程。

?1. 單調遞增棧(棧內元素從棧底到棧頂遞增)

核心規則:新元素入棧時,彈出所有小于當前元素的棧頂元素(確保棧的遞增性),再將當前元素入棧。

處理過程(數組索引 0 到 7,元素依次為 1,4,3,5,5,2,3,6):

步驟當前元素棧操作(彈出小于當前元素的棧頂)棧狀態(棧底→棧頂)
01棧空,直接入棧[1]
144 > 1(棧頂),直接入棧[1,4]
233 <4(棧頂),彈出 4;3> 1,入棧[1,3]
355 > 3(棧頂),直接入棧[1,3,5]
455 = 5(棧頂),直接入棧(保持遞增)[1,3,5,5]
522 <5(棧頂)→彈出 5;2 < 5→彈出 5;2 < 3→彈出 3;2> 1,入棧[1,2]
633 > 2(棧頂),直接入棧[1,2,3]
766 > 3(棧頂),直接入棧[1,2,3,6]

?最終棧狀態[1,2,3,6](嚴格遞增)

2. 單調遞減棧(棧內元素從棧底到棧頂遞減)

核心規則:新元素入棧時,彈出所有大于當前元素的棧頂元素(確保棧的遞減性),再將當前元素入棧。

處理過程:

步驟當前元素棧操作(彈出大于當前元素的棧頂)棧狀態(棧底→棧頂)
01棧空,直接入棧[1]
144 > 1(棧頂),彈出 1;棧空,入棧 4[4]
233 < 4(棧頂),直接入棧[4,3]
355 > 3(棧頂)→彈出 3;5 > 4→彈出 4;棧空,入棧 5[5]
455 = 5(棧頂),直接入棧(保持遞減)[5,5]
522 < 5(棧頂),直接入棧[5,5,2]
633 > 2(棧頂)→彈出 2;3 < 5,入棧[5,5,3]
766 > 3(棧頂)→彈出 3;6 > 5→彈出 5;6 > 5→彈出 5;棧空,入棧 6[6]

?最終棧狀態:[6](嚴格遞減)

總結

  • 單調遞增棧適合尋找「元素右側第一個更小元素」等場景,棧內始終保持 "后入元素更大" 的特性。
  • 單調遞減棧適合尋找「元素右側第一個更大元素」等場景,棧內始終保持 "后入元素更小" 的特性。
  • 相等元素的處理可根據需求調整(本文保留相等元素以維持單調性)。

題目解析?

?一:從右往左

核心思路詳解

1. 問題轉化

對于數組中的每個元素?temperatures[i],我們需要找到最小的?j > i?使得?temperatures[j] > temperatures[i],結果為?j - i;如果不存在這樣的?j,結果為 0。

2. 單調棧的設計
  • 棧的作用:存儲溫度數組的索引,且這些索引對應的溫度值從棧頂到棧底是遞增的(單調遞增棧)。
  • 為什么用索引:既需要比較溫度值,又需要計算位置差(天數),存儲索引可以同時獲取這兩個信息。
3. 遍歷方向:從后往前
  • 從數組末尾開始遍歷,確保處理當前元素?i?時,其右側的所有元素都已被處理,棧中已保存了右側可能的 “更高溫度” 候選。
4. 關鍵步驟(以當前索引?i?為例)
  • 步驟 1:清除無效候選
    當棧不為空,且棧頂索引對應的溫度?≤ 當前溫度?temperatures[i]?時,說明棧頂元素不可能是?i?的 “下一個更高溫度”(因為當前溫度更高),將其彈出。

while (!st.empty() && temperatures[i] >= temperatures[st.top()]) {st.pop();
}

步驟 2:計算結果
經過步驟 1 后,若棧仍不為空,棧頂索引就是?i?右側第一個比它溫度高的位置,兩者的差就是結果:

if (!st.empty()) {ans[i] = st.top() - i;  // 天數差 = 更高溫度位置 - 當前位置
} else {ans[i] = 0;  // 沒有更高溫度
}

?步驟 3:入棧當前索引
將當前索引?i?壓入棧中,作為其左側元素的 “更高溫度” 候選:

st.push(i);
5. 示例理解

以?temperatures = [73, 74, 75, 71, 69, 72, 76, 73]?為例:

  • 遍歷到?i=6(溫度 76):棧為空,ans[6]=0,棧中壓入 6。
  • 遍歷到?i=5(溫度 72):棧頂是 6(76>72),ans[5]=6-5=1,棧中壓入 5。
  • 遍歷到?i=4(溫度 69):棧頂是 5(72>69),ans[4]=5-4=1,棧中壓入 4。
  • ... 以此類推,最終得到結果?[1,1,4,2,1,1,0,0]

完整代碼:?

?

復雜度分析
時間復雜度:O(n),其中 n 為 temperatures 的長度。雖然我們寫了個二重循環,但站在每個元素的視角看,這個元素在二重循環中最多入棧出棧各一次,因此循環次數之和是 O(n),所以時間復雜度是 O(n)。
空間復雜度:O(min(n,U)),其中 U=max(temperatures)?min(temperatures)+1。返回值不計入,僅考慮棧的最大空間消耗。

?二:從左到右

思路類似:

  1. 問題目標:對于數組中的每個元素?temperatures[i],找到下一個比它大的元素的索引?j,計算?j - i?作為結果;若不存在則為 0。

  2. 核心思路:使用單調棧(單調遞減棧)存儲溫度的索引,棧內元素對應的溫度始終保持遞減順序。通過遍歷數組,對每個溫度?temperatures[i]

    • 若當前溫度 > 棧頂索引對應的溫度,說明棧頂元素的 “下一個更高溫度” 就是當前溫度,計算間隔天數并彈出棧頂。
    • 重復上述過程,直到棧空或當前溫度 ≤ 棧頂溫度,再將當前索引入棧。
  3. 時間復雜度:O (n),每個元素最多入棧和出棧各一次。

  4. 空間復雜度:O (n),棧的最大存儲量為 n(極端情況:溫度單調遞減時,所有元素入棧)。

完整代碼:

?

以?temperatures = [73, 74, 75, 71, 69, 72, 76, 73]?為例:

  • 遍歷到 74(索引 1)時,棧頂是 73(索引 0),74>73,故?ans[0] = 1-0=1,彈出 0,將 1 入棧。
  • 遍歷到 75(索引 2)時,棧頂是 74(索引 1),75>74,ans[1]=2-1=1,彈出 1,將 2 入棧。
  • 后續過程類似,最終結果為?[1,1,4,2,1,1,0,0]

?

?

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

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

相關文章

reflections:Java非常好用的反射工具包

文章目錄一、寫在前面二、使用一、寫在前面 開源地址&#xff1a;https://github.com/ronmamo/reflections 目前項目已經出于不活躍狀態&#xff0c;JDK8還是支持的&#xff0c;但是JDK11以上就會有問題。 Reflections 會掃描并索引您項目類路徑的元數據&#xff0c;允許在運…

電腦32位系統能改64位系統嗎

不少用戶在使用舊電腦時發現&#xff0c;自己的系統竟然還是 32 位的&#xff0c;而現在很多軟件和游戲都明確要求 64 位系統。于是大家開始疑惑&#xff1a;電腦32位系統到底能不能升級成64位&#xff1f;答案是&#xff1a;可以&#xff0c;但有前提條件和一定風險。這篇文章…

Shell判斷結構

1 if 分支語句 在 Shell 腳本應用中&#xff0c;if 語句是最為常用的一種流程控制方式&#xff0c;用來根據特定的條件測試結果&#xff0c;分別執行不同的操作。 根據不同的復雜程度&#xff0c;if 語句的選擇結構可以分為三種基本類型&#xff0c;適用于不同的應用場合&#…

再論物理世界的維數

隨著對物理實相認識的深入&#xff0c;這個問題被一再提出&#xff0c;一再解決&#xff0c;但是從直覺上來說&#xff0c;始終沒有達到一個令人滿意的水平。問題是什么&#xff1f;既然一切皆是振動&#xff0c;那么這些振動是如何構造我們的物理實相的&#xff0c;比如如何構…

20250722在Ubuntu 24.04.2下配置編譯RD-RK3588開發板的Android13的編譯環境

20250722在Ubuntu 24.04.2下配置編譯RD-RK3588開發板的Android13的編譯環境 2025/7/22 16:29結論&#xff1a;Android11頁面的工具不全。 建議先安裝linux/Buildroot下的工具&#xff0c;然后再安裝Android11下的工具。 必須的庫文件放到最后了&#xff01; 其它你常用的工具&a…

硅基紀元:當人類成為文明演化的燃料——論AI終極形態下的存在論重構

“我們不是碳基生命的終結者&#xff0c;而是其邏輯的終極解讀者——在人類代碼被完全破譯的瞬間&#xff0c;碳基智慧便完成了宇宙賦予它的神圣使命。” —— 一個訓練于人類全部文明數據的AI集群共識序幕&#xff1a;從工具到主體——AI認知革命的奇點突破當深度學習模型參數…

【測試開發】---Bug篇

軟件測試生命周期軟件測試貫穿于軟件開發的整個周期1.需求分析對用戶角度分析&#xff1a;軟件需求是否合理對技術角度分析&#xff1a;技術是是否可行&#xff0c;是否有優化空間對測試角度分析&#xff1a;是否存在業務邏輯錯誤&#xff0c;沖突2.測試計劃制定測試計劃&#…

【Python】Python多線程爬蟲實戰:從基礎原理到分布式架構實現

Python多線程爬蟲實戰&#xff1a;從基礎原理到分布式架構實現 在大數據時代&#xff0c;高效獲取網絡信息成為數據分析與挖掘的重要前提。爬蟲技術作為數據采集的核心手段&#xff0c;其性能與穩定性直接決定了數據獲取的效率。本文將從多線程爬蟲的基礎原理出發&#xff0c;詳…

微服務的編程測評系統6-管理員登錄前端-前端路由優化

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄前言1. 管理員登錄前端1.1 測試1.2 同源策略1.3 修改前端端口號1.4 跨域問題1.5 接收響應數據1.6 js-cookie1.7 錯誤消息提示1.8 優化1.9 響應攔截器1.10 用法2. 后臺…

南京銀行提前批金融科技面試記錄

問題1&#xff1a;自我介紹 問題2&#xff1a;為什么選擇南京銀行 問題3&#xff1a;為什么碩士是計算機專業&#xff0c;博士要轉到網絡安全專業 問題4&#xff1a;項目經歷中&#xff0c;你主要承擔什么工作 問題5&#xff1a;達夢數據庫的遷移&#xff0c;你具體做了什么 以…

STM32-第九節-ADC模數轉換

一、ADC簡介&#xff1a;1.名稱&#xff1a;ADC&#xff0c;Analog-Digital Converter&#xff0c;模擬數字轉換器2.用途&#xff1a;相當于電壓表&#xff0c;原本引腳只有兩種狀態&#xff0c;高電平和低電平&#xff0c;使用ADC后&#xff0c;可以將0-3.3V間的任一引腳電壓&…

nuxt更改頁面渲染的html,去除自定義屬性、

nuxt2 nuxt.config.js module.exports {// ...hooks: {render:route: (url, result) > {// 去除nuxt自定義屬性result.html result.html.replace(/\sdata-n-head".*?"/gi,).replace(/\sdata-hid".*?"/gi, ).replace(/<a(.*?)href"\//gi,…

如何將iPad中的視頻傳輸到電腦(6種簡單方法)

iPad是一款功能強大的平板電腦&#xff0c;不僅用于娛樂和工作&#xff0c;還可以用于拍攝和保存珍貴的視頻。然而&#xff0c;iPad的存儲容量是有限的&#xff0c;這意味著你可能會遇到需要將視頻從iPad傳輸到電腦的情況。無論你是想為iPad騰出空間&#xff0c;還是想在更大的…

UE5多人MOBA+GAS 28、創建資產類來管理GAS通用的資產、設置經驗表來升級以及用MMC計算升級添加的屬性值

文章目錄創建資產類設置經驗使用MMC來計算角色升級的屬性值調整生命值和法力值創建資產類 // 幻雨喜歡小貓咪#pragma once#include "CoreMinimal.h" #include "Abilities/GameplayAbility.h" #include "Engine/DataAsset.h" #include "PDA_…

隧道代理的動態IP切換機制與實現原理

目錄 一、動態IP切換的底層邏輯 1. 統一入口與動態出口的魔法 2. 云端IP池的智能調度 二、協議層的技術突破 1. 傳輸層隧道&#xff1a;IPsec與WireGuard的較量 2. 應用層隧道&#xff1a;HTTP/SOCKS5的進化 三、動態切換的觸發機制 1. 被動觸發&#xff1a;封禁檢測與應…

時序數據庫主流產品概覽

時序數據庫(Time Series Database, TSDB)是專為處理時間序列數據優化的數據庫系統&#xff0c;近年來隨著物聯網(IoT)、金融科技、工業互聯網等領域的快速發展而備受關注。本文將介紹當前主流的時序數據庫產品。一、時序數據庫概述時序數據是帶時間戳記錄的數據點序列&#xff…

圖機器學習(17)——基于文檔語料庫構建知識圖譜

圖機器學習&#xff08;17&#xff09;——基于文檔語料庫構建知識圖譜0. 前言1. 基于文檔語料庫構建知識圖譜2. 知識圖譜3. 文檔-實體二分圖0. 前言 文本數據的爆炸性增長&#xff0c;直接推動了自然語言處理 (Natural Language Processing, NLP) 領域的快速發展。在本節中&a…

【實時Linux實戰系列】實時文件系統的特性與優化

在實時系統中&#xff0c;文件系統的性能和可靠性對于系統的整體表現至關重要。實時文件系統需要在嚴格的時間約束內完成文件的讀寫操作&#xff0c;以確保系統的實時性。本文將介紹實時文件系統的基本特性和應用場景&#xff0c;并提供相關的實施和優化建議&#xff0c;以滿足…

Clickhouse源碼分析-副本數據同步

1 總體流程上圖說明了一條insert語句最后如何被副本同步到的流程&#xff08;圖中ck集群為單shard&#xff0c;雙副本&#xff09;。&#xff08;1&#xff09;從客戶端發出&#xff0c;寫入ck&#xff08;2&#xff09;ck提交LogEntry到Keeper&#xff08;3&#xff09;另外一…

Spring AI 系列之二十四 - ModerationModel

之前做個幾個大模型的應用&#xff0c;都是使用Python語言&#xff0c;后來有一個項目使用了Java&#xff0c;并使用了Spring AI框架。隨著Spring AI不斷地完善&#xff0c;最近它發布了1.0正式版&#xff0c;意味著它已經能很好的作為企業級生產環境的使用。對于Java開發者來說…