快轉到主要內容
  1. LeetCode/

LeetCode 155: Min Stack

·1 分鐘· ·
LeetCode Daily Medium Stack Constant-Time Data-Structures Design Tuple
Wei Yi Chung
作者
Wei Yi Chung
Working at the contributing of open source, distributed systems, and data engineering.
目錄

基本資料
#

難易度: Medium 第一次嘗試: 2025-08-10

  • 總花費時間:00:00.00

解題思路
#

這是一個堆疊問題,我們需要在任何時候都能追蹤最小元素。為了實現 getMin() 操作的 O(1) 時間複雜度,我們可以在元組中儲存每個元素以及當前的最大值。這樣,堆疊中的每個元素都知道它被推入時的最小值是什麼。

解法
#

這個解決方案使用元組方法,其中每個堆疊元素包含:

  1. 數值:實際被推入的值
  2. 當前最小值:推入時堆疊中的最小值

這個設計允許我們:

  • 推入 (Push):O(1) - 計算新的最小值並與值一起儲存
  • 彈出 (Pop):O(1) - 移除頂部元素
  • 頂部 (Top):O(1) - 返回頂部值
  • 獲取最小值 (GetMin):O(1) - 從頂部元素返回當前最小值
class MinStack:

    def __init__(self):
        self.stack: list[tuple] = []

    def push(self, val: int) -> None:
        min_latest = self.stack[-1][1] if self.stack else float("inf")
        min_latest = min(val, min_latest)
        self.stack.append((val, min_latest))

    def pop(self) -> None:
        val, _ = self.stack.pop()
        return val

    def top(self) -> int:
        val, _ = self.stack[-1] if self.stack else (None, None)
        return val

    def getMin(self) -> int:
        _, min_num = self.stack[-1] if self.stack else (None, None)
        return min_num

時間複雜度:所有操作都是 O(1) 空間複雜度:O(n),其中 n 是被推入的元素數量

收穫
#

  • 元組設計:使用元組來儲存值和最小值既優雅又高效
  • 常數時間操作:所有堆疊操作都保持 O(1) 時間複雜度
  • 空間權衡:我們使用額外空間來儲存最小值,但獲得了常數時間的存取
  • 設計模式:這展示了如何設計具有特定性能保證的資料結構

遇到的問題
#

  • 理解需求:最初不清楚如何實現 O(1) 的最小值檢索
  • 元組結構:決定使用元組來儲存值和最小值是關鍵洞察
  • 邊界情況:在 top()getMin() 方法中處理空堆疊的情況
  • pop 的返回值pop() 方法應該返回被彈出的值,而不只是移除它

相關文章

LeetCode 901: Online Stock Span
·1 分鐘
LeetCode Daily Medium Stack Monotonic-Stack Data-Structures Design Design-Patterns Stock
使用單調堆疊解決股票價格跨度問題
LeetCode 150: Evaluate Reverse Polish Notation
·1 分鐘
LeetCode Daily Medium Stack Data-Structures Expression-Evaluation Math Postfix-Notation Reverse-Polish-Notation
使用堆疊解決逆波蘭表示法求值問題
LeetCode 739: Daily Temperatures
·1 分鐘
LeetCode Daily Medium Array Stack Monotonic-Stack Data-Structures Temperature Waiting-Time
使用單調堆疊解決每日溫度問題
LeetCode 20: Valid Parentheses
·1 分鐘
LeetCode Daily Easy String Stack Data-Structures Parentheses Validation
使用堆疊解決有效括號問題
LeetCode 853: Car Fleet
·1 分鐘
LeetCode Daily Medium Array Stack Greedy Simulation Sorting
使用堆疊方法解決車隊問題
LeetCode 503: Next Greater Element II(單調棧)
·1 分鐘
LeetCode Daily Medium Array Stack Monotonic-Stack Circular-Array
單調棧、環狀陣列