每天一道劍指offer-包含min函數的棧
- 2019 年 10 月 4 日
- 筆記
前言
今天的題目 每天的題目見github(看最新的日期): https://github.com/gzc426 具體的題目可以去牛客網對應專題去找。
昨天的題解
題目
每天一道劍指offer-包含min函數的棧 來源:牛客網對應專題
題目詳述
定義棧的數據結構,請在該類型中實現一個能夠得到棧中所含最小元素的min函數(時間複雜度應為O(1))。
題目詳解
思路
- 利用一個輔助棧來存放最小值
- 棧 3,4,2,5,1
- 輔助棧 3,3,2,2,1
- 每入棧一次,就與輔助棧頂比較大小,如果小就入棧,如果大就入棧當前的輔助棧頂 當出棧時,輔助棧也要出棧
- 棧3 輔助棧入3,
- 棧4,輔助棧棧頂比4小入3,
- 棧入2,輔助棧棧頂是3比2大所以入2,每次都是把棧頂與入棧的值比較,入那個最小的,這樣棧頂一直最小。
程式碼
import java.util.Stack; public class Solution { Stack<Integer> stack1 = new Stack<>(); Stack<Integer> stack2 = new Stack<>(); public void push(int node) { stack1.push(node); if(stack2.empty()) { stack2.push(node); }else{ if(node <= (int)stack2.peek()) //這個if/else是比較棧頂與入棧的值,哪個小入哪個 stack2.push(node); else{ stack2.push(stack2.peek()); } } } public void pop() { stack2.pop();//出棧是都出棧的 stack1.pop(); } public int top() { return (int)stack1.peek(); } public int min() { return (int)stack2.peek();//棧2是輔助棧,每次都是最小值 } }
程式碼截圖(避免亂碼)
