單調棧(打卡)

本篇基于b站靈茶山艾府。

下面是靈神上課講解的題目與課后作業,課后作業還有三道實在寫不下去了,下次再寫。

739. 每日溫度

給定一個整數數組 temperatures ,表示每天的溫度,返回一個數組 answer ,其中 answer[i] 是指對于第 i 天,下一個更高溫度出現在幾天后。如果氣溫在這之后都不會升高,請在該位置用 0 來代替。

示例 1:

輸入: temperatures = [73,74,75,71,69,72,76,73]
輸出: [1,1,4,2,1,1,0,0]

示例 2:

輸入: temperatures = [30,40,50,60]
輸出: [1,1,1,0]

示例 3:

輸入: temperatures = [30,60,90]
輸出: [1,1,0]

class Solution:def dailyTemperatures(self, temperatures: List[int]) -> List[int]:# 1.從右到左# st = []  # 存儲的是下標# ans = [0] * len(temperatures)# for i in range(len(temperatures) - 1, -1, -1):#     t = temperatures[i]#     while st and temperatures[st[-1]] <= t:#         # 如果棧中有元素且棧口溫度小于等于當前溫度,則棧口的溫度不可能是前面溫度的答案,彈出#         st.pop()#     # 如果棧不為空,說明后面存在比當前溫度高的溫度,記錄答案#     if st:#         ans[i] = st[-1] - i#     # 當前溫度進棧#     st.append(i)# return ans# 2.從左到右st = []     # 棧內存儲的是還沒記錄答案的每日溫度ans = [0] * len(temperatures)for i, t in enumerate(temperatures):# 如果棧不為空且當前溫度大于棧口元素,說明當前溫度是棧口溫度的答案while st and t > temperatures[st[-1]]:ans[st[-1]] = i - st[-1]st.pop()# 進棧st.append(i)return ans# 第一種做法相當于每輪循環都會記錄當天的答案# 第二種做法相當于只有在彈出棧時才記錄答案


42. 接雨水

給定 n 個非負整數表示每個寬度為 1 的柱子的高度圖,計算按此排列的柱子,下雨之后能接多少雨水。

示例 1:

img

輸入:height = [0,1,0,2,1,0,1,3,2,1,2,1]
輸出:6
解釋:上面是由數組 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度圖,在這種情況下,可以接 6 個單位的雨水(藍色部分表示雨水)。 

示例 2:

輸入:height = [4,2,0,3,2,5]
輸出:9

class Solution:def trap(self, height: List[int]) -> int:# 橫著看,當前柱子什么時候能接水?# 當后面柱子的高度超過當前柱子的高度時,就能接水了st = []  # 棧內元素單調遞增s = 0for i, right_h in enumerate(height):while st and height[st[-1]] < right_h:# 如果當前柱子高度大于棧口元素高度,說明棧口元素的柱子是能接水的mid_h = height[st.pop()]  # 棧口元素高度# 如果棧中沒有柱子了,那水會從左邊流出去,退出if not st:breakleft_h = height[st[-1]]  # 左邊數字的高度w = i - st[-1] - 1  # 寬度h = min(left_h, right_h) - mid_h  # 高度s += w * h  # 面積st.append(i)return s


496. 下一個更大元素 I

nums1 中數字 x下一個更大元素 是指 xnums2 中對應位置 右側第一個x 大的元素。

給你兩個 沒有重復元素 的數組 nums1nums2 ,下標從 0 開始計數,其中nums1nums2 的子集。

對于每個 0 <= i < nums1.length ,找出滿足 nums1[i] == nums2[j] 的下標 j ,并且在 nums2 確定 nums2[j]下一個更大元素 。如果不存在下一個更大元素,那么本次查詢的答案是 -1

返回一個長度為 nums1.length 的數組 ans 作為答案,滿足 ans[i] 是如上所述的 下一個更大元素

示例 1:

輸入:nums1 = [4,1,2], nums2 = [1,3,4,2].
輸出:[-1,3,-1]
解釋:nums1 中每個值的下一個更大元素如下所述:
- 4 ,用加粗斜體標識,nums2 = [1,3,4,2]。不存在下一個更大元素,所以答案是 -1 。
- 1 ,用加粗斜體標識,nums2 = [1,3,4,2]。下一個更大元素是 3 。
- 2 ,用加粗斜體標識,nums2 = [1,3,4,2]。不存在下一個更大元素,所以答案是 -1 。

示例 2:

輸入:nums1 = [2,4], nums2 = [1,2,3,4].
輸出:[3,-1]
解釋:nums1 中每個值的下一個更大元素如下所述:
- 2 ,用加粗斜體標識,nums2 = [1,2,3,4]。下一個更大元素是 3 。
- 4 ,用加粗斜體標識,nums2 = [1,2,3,4]。不存在下一個更大元素,所以答案是 -1 。

class Solution:def nextGreaterElement(self, nums1: List[int], nums2: List[int]) -> List[int]:idx = {x: i for i, x in enumerate(nums1)}st = []ans = [-1] * len(nums1)# 1.從左向右# for i, x in enumerate(nums2):#     # 如果當前元素大于棧口元素,說明可以記錄在棧口的答案了#     while st and x > nums2[st[-1]]:#         j = st.pop()#         if nums2[j] in idx:     # 如果棧口元素在nums1中#             ans[idx[nums2[j]]] = x  # 記錄答案#     st.append(i)    # 元素進棧# return ans# 2.從右到左for i in range(len(nums2) - 1, -1, -1):num = nums2[i]# 如果當前元素大于等于棧口元素,說明棧口的元素永遠不可能是前面元素的答案,出棧while st and num >= nums2[st[-1]]:st.pop()# 如果棧不為空,此時棧口元素大于當前元素,說明可以記錄當前元素的答案了if st and num in idx:ans[idx[num]] = nums2[st[-1]]st.append(i)    # 元素進棧return ans


503. 下一個更大元素 II

給定一個循環數組 numsnums[nums.length - 1] 的下一個元素是 nums[0] ),返回 nums 中每個元素的 下一個更大元素

數字 x下一個更大的元素 是按數組遍歷順序,這個數字之后的第一個比它更大的數,這意味著你應該循環地搜索它的下一個更大的數。如果不存在,則輸出 -1

示例 1:

輸入: nums = [1,2,1]
輸出: [2,-1,2]
解釋: 第一個 1 的下一個更大的數是 2;
數字 2 找不到下一個更大的數; 
第二個 1 的下一個最大的數需要循環搜索,結果也是 2。

示例 2:

輸入: nums = [1,2,3,4,3]
輸出: [2,3,4,-1,4]

class Solution:def nextGreaterElements(self, nums: List[int]) -> List[int]:# 循環兩遍元素,確保下一個更大元素在循環搜索中發現st = []ans = [-1] * len(nums)n = len(nums)# 1. 從左向右# for i in range(n * 2):#     num = nums[i % n]#     while st and num > nums[st[-1]]:#         j = st.pop()#         ans[j] = num#     st.append(i % n)# return ans# 2.從右向左for i in range(n * 2 - 1, -1, -1):num = nums[i % n]while st and num >= nums[st[-1]]:st.pop()if st:ans[i % n] = nums[st[-1]]st.append(i % n)return ans


1475. 商品折扣后的最終價格

給你一個數組 prices ,其中 prices[i] 是商店里第 i 件商品的價格。

商店里正在進行促銷活動,如果你要買第 i 件商品,那么你可以得到與 prices[j] 相等的折扣,其中 j 是滿足 j > iprices[j] <= prices[i]最小下標 ,如果沒有滿足條件的 j ,你將沒有任何折扣。

請你返回一個數組,數組中第 i 個元素是折扣后你購買商品 i 最終需要支付的價格。

示例 1:

輸入:prices = [8,4,6,2,3]
輸出:[4,2,4,2,3]
解釋:
商品 0 的價格為 price[0]=8 ,你將得到 prices[1]=4 的折扣,所以最終價格為 8 - 4 = 4 。
商品 1 的價格為 price[1]=4 ,你將得到 prices[3]=2 的折扣,所以最終價格為 4 - 2 = 2 。
商品 2 的價格為 price[2]=6 ,你將得到 prices[3]=2 的折扣,所以最終價格為 6 - 2 = 4 。
商品 3 和 4 都沒有折扣。

示例 2:

輸入:prices = [1,2,3,4,5]
輸出:[1,2,3,4,5]
解釋:在這個例子中,所有商品都沒有折扣。

示例 3:

輸入:prices = [10,1,1,6]
輸出:[9,0,1,6]

class Solution:def finalPrices(self, prices: List[int]) -> List[int]:st = []ans = prices.copy()# 1.從左到右# for i, x in enumerate(prices):#     while st and x <= prices[st[-1]]:#         j = st.pop()#         ans[j] = prices[j] - x#     st.append(i)# return ans# 2.從右到左for i in range(len(prices) - 1, -1, -1):while st and prices[i] < prices[st[-1]]:st.pop()if st:ans[i] = prices[i] - prices[st[-1]]st.append(i)return ans


901. 股票價格跨度

設計一個算法收集某些股票的每日報價,并返回該股票當日價格的 跨度

當日股票價格的 跨度 被定義為股票價格小于或等于今天價格的最大連續日數(從今天開始往回數,包括今天)。

  • 例如,如果未來 7 天股票的價格是 [100,80,60,70,60,75,85],那么股票跨度將是 [1,1,1,2,1,4,6]

實現 StockSpanner 類:

  • StockSpanner() 初始化類對象。
  • int next(int price) 給出今天的股價 price ,返回該股票當日價格的 跨度

示例:

輸入:
["StockSpanner", "next", "next", "next", "next", "next", "next", "next"]
[[], [100], [80], [60], [70], [60], [75], [85]]
輸出:
[null, 1, 1, 1, 2, 1, 4, 6]解釋:
StockSpanner stockSpanner = new StockSpanner();
stockSpanner.next(100); // 返回 1
stockSpanner.next(80);  // 返回 1
stockSpanner.next(60);  // 返回 1
stockSpanner.next(70);  // 返回 2
stockSpanner.next(60);  // 返回 1
stockSpanner.next(75);  // 返回 4 ,因為截至今天的最后 4 個股價 (包括今天的股價 75) 都小于或等于今天的股價。
stockSpanner.next(85);  // 返回 6

# 往回找小于等于今天價格的連續日期,其實就是找上一個更大元素
class StockSpanner:def __init__(self):self.st = []self.prices = []def next(self, price: int) -> int:self.prices.append(price)# 1. 從左到右# 如果當前元素大于等于棧口元素,那么將棧口元素出棧# 如果當前元素小于棧口元素,那么記錄當前元素的答案while self.st and price >= self.prices[self.st[-1]]:# 如果當前股票價格大于棧口元素,那么永遠不可能是后面元素的答案,彈出self.st.pop()if self.st:ans = len(self.prices) - self.st[-1] - 1else:# 如果棧沒元素了,說明前面的股票都大于等于當前股票ans = len(self.prices)self.st.append(len(self.prices) - 1)return ans# 2.從右到左# 如果當前元素大于棧口元素,說明棧口的元素找到答案了,記錄并彈出# 如果當前元素小于等于棧口元素,則進棧# 但由于此題是每天都要返回一次答案,這種思路是只有當當前元素大于棧口元素了,才能返回棧口元素的答案# 所以此題只能按照從右到左的思路# Your StockSpanner object will be instantiated and called as such:
# obj = StockSpanner()
# param_1 = obj.next(price)


1019. 鏈表中的下一個更大節點

給定一個長度為 n 的鏈表 head

對于列表中的每個節點,查找下一個 更大節點 的值。也就是說,對于每個節點,找到它旁邊的第一個節點的值,這個節點的值 嚴格大于 它的值。

返回一個整數數組 answer ,其中 answer[i] 是第 i 個節點( 從1開始 )的下一個更大的節點的值。如果第 i 個節點沒有下一個更大的節點,設置 answer[i] = 0

示例 1:

img

輸入:head = [2,1,5]
輸出:[5,5,0]

示例 2:

img

輸入:head = [2,7,4,3,5]
輸出:[7,0,5,5,0]

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:def nextLargerNodes(self, head: Optional[ListNode]) -> List[int]:st = []     # 棧里面存儲的是(下標,節點值)ans = []# 從左到右# 如果當前元素大于棧口元素,說明棧口的元素找到答案了,記錄并彈出# 如果當前元素小于等于棧口元素,說明還沒有找到答案,進棧while head:ans.append(0)  # 占位while st and head.val > st[-1][1]:j, val = st.pop()ans[j] = head.valst.append((len(ans) - 1, head.val))head = head.nextreturn ans


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

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

相關文章

【機器學習基礎】機器學習入門核心算法:層次聚類算法(AGNES算法和 DIANA算法)

機器學習入門核心算法&#xff1a;層次聚類算法&#xff08;AGNES算法和 DIANA算法&#xff09; 一、算法邏輯二、算法原理與數學推導1. 距離度量2. 簇間距離計算&#xff08;連接標準&#xff09;3. 算法偽代碼&#xff08;凝聚式&#xff09; 三、模型評估1. 內部評估指標2. …

已有的前端項目打包到tauri運行(windows)

1.打包前端項目產生靜態html、css、js 我們接下來用vue3 vite編寫一個番茄鐘案例來演示。 我們執行npm run build 命令產生的dist目錄下的靜態文件。 2.創建tarui項目 npm create tauri-applatest一路回車&#xff0c;直到出現。 3.啟動運行 我們將打包產生的dist目錄下的…

Unity3D仿星露谷物語開發55之保存地面屬性到文件

1、目標 將游戲保存到文件&#xff0c;并從文件中加載游戲。 Player在游戲中種植的Crop&#xff0c;我們希望保存到文件中&#xff0c;當游戲重新加載時Crop的GridProperty數據仍然存在。這次主要實現保存地面屬性&#xff08;GridProperties&#xff09;信息。 我們要做的是…

Java面試:企業協同SaaS中的技術挑戰與解決方案

Java面試&#xff1a;企業協同SaaS中的技術挑戰與解決方案 面試場景 在一家知名互聯網大廠&#xff0c;面試官老王正在對一位應聘企業協同SaaS開發職位的程序員謝飛機進行技術面試。 第一輪提問&#xff1a;基礎技術 老王&#xff1a;謝飛機&#xff0c;你好。首先&#xf…

SQL注入速查表(含不同數據庫攻擊方式與差異對比)

1. 字符串連接 字符串連接是SQL注入中常用的操作&#xff0c;用于將多個字符串拼接為一個&#xff0c;以構造復雜的注入語句。不同數據庫的字符串連接語法存在顯著差異&#xff0c;了解這些差異有助于精準構造payload。 Oracle&#xff1a;使用||操作符進行字符串連接&#xf…

uni-data-picker級聯選擇器、fastadmin后端api

記錄一個部門及部門人員選擇的功能&#xff0c;效果如下&#xff1a; 組件用到了uni-ui的級聯選擇uni-data-picker 開發文檔&#xff1a;uni-app官網 組件要求的數據格式如下&#xff1a; 后端使用的是fastadmin&#xff0c;需要用到fastadmin自帶的tree類生成部門樹 &#x…

Mac電腦上本地安裝 redis并配置開啟自啟完整流程

文章目錄 一、安裝 Redis方法 1&#xff1a;通過源碼編譯安裝&#xff08;推薦&#xff09;方法 2&#xff1a;通過 Homebrew 安裝&#xff08;可選&#xff09; 二、配置 Redis1. 創建配置文件和數據目錄2. 修改配置文件 三、配置開機自啟1、通過 launchd 系統服務&#xff08…

wsl安裝linux

安裝wsl 啟用適用于 Linux 的 Windows 子系統 以管理員身份打開 PowerShell &#xff08;> PowerShell > 右鍵單擊 > 以管理員身份運行&#xff09; 并輸入以下命令&#xff0c;然后重啟 dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsyste…

OpenGL 3D 編程

OpenGL 是一個強大的跨平臺圖形 API,用于渲染 2D 和 3D 圖形。以下是 OpenGL 3D 編程的入門基礎。 一. 環境設置 安裝必要的庫 GLFW: 用于創建窗口和處理輸入 GLEW 或 GLAD: 用于加載 OpenGL 函數 GLM: 數學庫,用于 3D 變換 // 基本 OpenGL 程序結構示例 #include <GL/g…

Android基于LiquidFun引擎實現軟體碰撞效果

一、實現效果 Android使用LiquidFun物理引擎實現果凍碰撞效果 二、Android代碼 // 加載liquidfun動態庫static {System.loadLibrary("liquidfun");System.loadLibrary("liquidfun_jni");}class ParticleData {long id;ParticleSystem particleSystem;float…

Redis持久化機制詳解:RDB與AOF的深度剖析

一、為什么需要持久化&#xff1f; Redis作為內存數據庫&#xff0c;數據存儲在易失性內存中。持久化機制解決兩大核心問題&#xff1a; 數據安全&#xff1a;防止服務器宕機導致數據丟失災難恢復&#xff1a;支持數據備份與快速重建 二、RDB&#xff1a;內存快照持久化 ? …

Netty學習example示例

文章目錄 simpleServer端NettyServerNettyServerHandler Client端NettyClientNettyClientHandler tcp&#xff08;粘包和拆包&#xff09;Server端NettyTcpServerNettyTcpServerHandler Client端NettyTcpClientNettyTcpClientHandler protocolcodecCustomMessageDecoderCustomM…

ThreadLocal ,底層原理,強引用,弱引用,內存泄漏

目錄 ThreadLocal的基本概念 底層實現原理 強引用與弱引用 內存泄漏問題 內存泄漏的解決方案 示例代碼 ThreadLocal的基本概念 ThreadLocal是Java中的一個類&#xff0c;位于java.lang包下&#xff0c;它提供了線程局部變量的功能。每個使用該變量的線程都有自己獨立的初…

TomSolver 庫 | config詳解及其測試

一、C 關鍵特性解析 1. enum class 強類型枚舉 enum class LogLevel { OFF, FATAL, ERROR, WARN, INFO, DEBUG, TRACE, ALL }; enum class NonlinearMethod { NEWTON_RAPHSON, LM };核心特性&#xff1a; 類型安全&#xff1a;禁止隱式轉換為整數作用域限定&#xff1a;必須…

【DB2】ERRORCODE=-4499, SQLSTATE=08001

客戶在連接DB2壓測時報錯ERRORCODE-4499, SQLSTATE08001&#xff0c;連接失敗&#xff0c;主要是因為通信失敗 在本地進行復現&#xff0c;用DBeaver代替java程序&#xff0c;將DB2COMM從TCPIP置為空&#xff0c;重啟后重新連接&#xff0c;報一樣的錯誤 而將防火墻開啟&…

MicroPython+L298N+ESP32控制電機轉速

要使用MicroPython控制L298N電機驅動板來控制電機的轉速&#xff0c;你可以通過PWM&#xff08;脈沖寬度調制&#xff09;信號來調節電機速度。L298N是一個雙H橋驅動器&#xff0c;可以同時控制兩個電機的正反轉和速度。 硬件準備&#xff1a; 1. L298N 電機控制板 2. ESP32…

WPF 全局加載界面、多界面實現漸變過渡效果

WPF 全局加載界面與漸變過渡效果 完整實現方案 MainWindow.xaml <Window x:Class"LoadingScreenDemo.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml&quo…

RabbitMQ深度解析:從基礎實踐到高階架構設計

引言?? 在分布式系統與微服務架構主導的現代軟件開發中&#xff0c;服務間通信的可靠性、異步處理能力及流量管控成為核心挑戰。??RabbitMQ??作為基于AMQP協議的企業級消息中間件&#xff0c;憑借其靈活的路由機制、高可用架構與豐富的擴展能力&#xff0c;成為異步通信…

華為OD機試真題——矩形相交的面積(2025A卷:100分)Java/python/JavaScript/C/C++/GO最佳實現

2025 A卷 100分 題型 本專欄內全部題目均提供Java、python、JavaScript、C、C++、GO六種語言的最佳實現方式; 并且每種語言均涵蓋詳細的問題分析、解題思路、代碼實現、代碼詳解、3個測試用例以及綜合分析; 本文收錄于專欄:《2025華為OD真題目錄+全流程解析+備考攻略+經驗分…

基于隨機函數鏈接神經網絡(RVFL)的鋰電池健康狀態(SOH)預測

基于隨機函數鏈接神經網絡(RVFL)的鋰電池健康狀態(SOH)預測 一、RVFL網絡的基本原理與結構 隨機向量功能鏈接(Random Vector Functional Link, RVFL)網絡是一種單隱藏層前饋神經網絡的隨機化版本,其核心特征在于輸入層到隱藏層的權重隨機生成且固定,輸出層權重通過最…