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