LeetCode 🟡 1381. Design a Stack With Increment Operation
🔗 🟡 1381. Design a Stack With Increment Operation 1286
tags: Weekly Contest 180 陣列(Array) 堆疊(Stack) 設計(Design)
題意
設計一個支持對其元素進行遞增操作的堆疊(Stack)。
實現 CustomStack 類別:
CustomStack(int maxSize)初始化對象,maxSize是堆疊中的最大元素數量。void push(int x)如果堆疊未達到maxSize,將x添加到堆疊頂部。int pop()彈出並返回堆疊頂部的元素,如果堆疊為空,則返回-1。void inc(int k, int val)將堆疊底部的k個元素遞增val。如果堆疊中的元素少於k個,則遞增所有堆疊中的元素。
約束條件
- 最多會分別對
increment,push和pop操作各調用 次。
思路:模擬(Simulation) + 懶標記(Lazy Tag)
除了 inc 操作,其他操作都是標準的堆疊操作,因此我們只需要關注 inc 操作。
首先注意到 inc 操作會影響到堆疊底部的元素,但標準的堆疊操作 push 和 pop 只會影響到頂部的元素。因此我們需要使堆疊中的所有元素都可以被直接訪問,這裡使用一個陣列 來模擬堆疊,並使用一個指標 來表示堆疊的頂部位置。
再來思考如何實現 inc 操作。最暴力的方式是每次 inc 操作都遍歷一次堆疊,將底部的 k 個元素遞增 val。但這樣會導致每次 inc 操作的時間複雜度變為 ,其中 是堆疊的最大容量。
為了降低時間複雜度,可以使用 懶標記(Lazy Tag) 的思想,只在需要時才進行值的更新。具體來說,引入一個與堆疊等長的 陣列,其中 表示 需要增加的值。當執行 inc 操作時,我們只需將 加到第 個元素(即下標 )的位置的 標記上,而不需要立即更新所有底部 個元素。
在 pop 操作時,當彈出頂部元素時,我們將其對應的 值加到該元素上,並將該 值 傳遞 給下一個元素(即 位置)。這樣,我們只在實際需要時才進行值的更新,從而減少不必要的操作。
此外,需要注意 inc 操作的邊界條件,當 超過堆疊的元素數量時,我們只需要將 加到堆疊頂部的元素上。
複雜度分析
- 時間複雜度:全為
push操作:pop操作:inc操作:
- 空間複雜度:
- 需要 的空間複雜度來保存堆疊和懶標記。
1 | class CustomStack: |
1 | class CustomStack { |
寫在最後
Cover photo is remixed from @吃肥皂泡泡, thanks for their work!
儘管暴力的解法也能 AC,但這題的關鍵在於如何優化 inc 操作。
本部落格所有文章除特別聲明外,均採用CC BY-NC-SA 4.0 授權協議。轉載請註明來源 十六個天亮!
評論
WalineGiscus






![Luogu 🟢 P2627 [USACO11OPEN] Mowing the Lawn G](https://i.gdst.dev/works/846172612737479668.webp)

