設計一個有 getMin 功能的棧
【 題目 】
實現一特殊的棧,在實現棧的基本功能的基礎上,再實現返回棧中最小元素的操作。
【 要求 】
1 . pep 、 push 、 getMin 操作的時間複雜度都是 O ( 1 ) 。
2 .設計的棧型別可以使用現成的棧結構。
【 解答 】
在設計上我們使用兩個棧,一個棧用來儲存當前棧中的元素,其功能和一個正常的棧沒有區別,這個棧記為 stackData ;另一個棧用於儲存每一步的最小值,這個棧記為 stackMin 。具體的實現方式有兩種。
第一種設計方案如下。
.壓入資料規則。
假設當前資料為 newNum ,先將其壓入 stackdata 。然後判斷 stackMin 是否為空:
· 如果為空,則 n ewN也壓入 atackMin .
· 如果不為空,則比較newNum 和atackMin 的棧頂元素中哪一個更小
· 如果 n ewNum 更小或兩者相等,則 newNum 也壓入 atackMin
· 如果 stackMin 中棧頂元素小,則 stackMin 不壓入任何內容。
舉例:依次壓入 3 、 4 、 5 、 1 、 2 、的過程中, stockdata 和 atackMin 的變化如圖 1 · 1 所示。
彈出資料規則
先在 stackData 中彈出棧頂元素,記為 value 。然後比較當前 stackMin 的棧頂元紊和 value 哪一個更小.
通過上文提到的壓入規則可知, stackMin 中存在的元素是從棧底到棧頂逐漸變小的, stackMin 棧頂的元素既是 stackMin 棧的最小值,也是當前 stackData 棧的最小值.所以不會出現value比stackMin 的棧頂元素更小的情況,value只可能大於或等於 staokMin 的棧頂元素。當 value等於 stackMin 的棧頂元素時, stackMin 彈出棧頂元素;
當 value 大於 stackMin 的棧頂元素時, stackMin 不彈出棧頂元素二返回value。
很明顯可以看出,壓入與彈出規則是對應的。
· 查詢當前棧中最小值操作
由於上文的壓入資料規則和彈出資料規則可知, stackMin 始終記錄著 stackdata 中的最小值,所以, stackMin 的棧頂元素始終是當前 stackData 中的最小值。
方案一的程式碼實現如 Mytack1 類所示:
第二種方案,小夥伴們可以一起交流一下哦
CSDN社群火爆招募中:https://blog.csdn.net/CSDNedu/article/details/80063505?utm_source=zwqt
相關文章
- 設計一個有getMin功能的棧
- 常見面試演算法題JS實現-設計一個有getMin功能的棧面試演算法JS
- 有始有終,設計一個結構合理的下載模組
- 數學,離一個程式設計師有多近?程式設計師
- 程式設計師如何能把一個功能說的工作量很大?程式設計師
- 設計包含min函式的棧函式
- Linkedlist的應用場景:設計佇列、設計棧佇列
- 做一個有產品思維的研發:邏輯設計
- 做一個有產品思維的研發:庫表設計
- 當一個java程式設計師到底有多難Java程式設計師
- 產品的功能設計
- 有前(錢)途的程式設計師的14個習慣,你有幾個?程式設計師
- Vue的第一個元件設計Vue元件
- 【介面功能設計】TopThink介面功能設計建議
- Java全棧程式設計師之01:做個Linux下的程式猿Java全棧程式設計師Linux
- 每到一個階段,都會有一個最火的程式設計師職位,目前就是前端!程式設計師前端
- 新Rust程式設計師需要學習的9個功能Rust程式設計師
- PHP歷理 做一個計算24點的功能PHP
- 併發程式設計 棧幀程式設計
- 介面設計方法 — 3. 字典功能的設計
- 【系統設計】設計一個限流元件元件
- 聊聊如何實現一個帶有攔截器功能的SPI
- 高效設計一個LRU
- 設計一個可靠的連線池
- 如何設計一個良好的API介面?API
- 《Web全棧實用程式設計》一書徵集意見Web全棧程式設計
- 找回密碼的功能設計密碼
- 如何構建一個沒有任何後端程式碼的全棧應用?- hashnode後端全棧
- 搭建我的第一個Docker應用棧Docker
- 面試了一個 39 歲程式設計師,我有點慌……面試程式設計師
- 設計一個基於svg的塗鴉元件(一)SVG元件
- 一個程式設計師的編年史程式設計師
- 如何設計一個牛逼的API介面API
- 一個理想主義的程式設計師程式設計師
- 一個程式設計師眼中的 UCAN 2019程式設計師
- 一個BAT老程式設計師的忠告!BAT程式設計師
- 如何做出一個好的設計方案
- 設計一個簡單的devops系統dev