LeetCode第155题—最小栈
本次寫的題目是最小棧,為LeetCode里面的題目,讓我們來康康是如何解出這道題目的吧,各位尚沒有思路的小伙伴可以跟隨著博主的解題思路一步步來,感受一下😎
🌱分析階段
在初看題目的時候我們要仔細(xì)看要求,并且可以對示例進(jìn)行畫圖模擬一下過程,在模擬后,我們可以知道我們所要做到的是什么👇:
?我們要做到最小棧,只需要多創(chuàng)建一個棧,命名為minStack。
為什么要設(shè)計一個minStack來專門存放最小數(shù)?這是因為我們每一次放入數(shù)據(jù)的時候,都可以先與棧頂?shù)脑乇容^,看看該數(shù)據(jù)是不是最小的,如果是最小,則放在minStack棧頂,這樣子就能夠保證minStack棧頂?shù)脑孛恳淮味际亲钚〉?#xff0c;然后棧頂往下的元素依次是:第二小,第三小,第四小...
接下來的各個函數(shù)我們一個一個分析。
🍃push函數(shù):在每次push的時候,都先比較一下。若minStack為空,則直接放入;若不為空,則先將push的元素與minStack的棧頂元素比較,比minStack的棧頂元素大的不放入,小于或者等于minStack的棧頂元素的,則push進(jìn)棧的同時,也push進(jìn)minStack。
🍃pop函數(shù):如果要彈出元素,則要先看看該元素是不是最小元素→可以讓stack的棧頂元素與minStack的棧頂元素比較,如果相等,則兩個棧都要彈出棧頂元素,反之則直接彈出stack元素即可。
🍃top函數(shù):這個函數(shù)直接使用stack.peek()函數(shù)即可。
🍃getMin函數(shù):該函數(shù)直接peek出minStack的棧頂元素即可😎
上面便是全部分析過程了,接下來讓我們到代碼階段。
🌱代碼階段
按照之前分析,我們先創(chuàng)建兩個棧,然后再一個一個函數(shù)逐漸完成。
🍃push函數(shù)
該函數(shù)沒有需要特別注意的地方,我們只需要按照之前分析的過程用代碼執(zhí)行出來即可。具體代碼如下👇:
import java.util.*;class MinStack {public Stack<Integer> stack = new Stack<>();public Stack<Integer> minStack = new Stack<>();public MinStack() {}public void push(int val) {if(minStack.empty()){minStack.push(val);}else{if(val<=minStack.peek()){minStack.push(val);}}stack.push(val);}//其他未寫代碼省略 }🍃pop函數(shù)
在pop函數(shù)這里我們要注意,其中有一個比較stack的棧頂元素與minStack棧頂元素的過程,如果相等則兩個棧都要彈出棧頂元素,反之則只彈出stack的棧頂元素。但是我們要注意一點:peek()函數(shù)的返回類型是Integr類。Integer類有一個特性:在[-128~128)區(qū)間內(nèi)的元素地址才相同。所以在比較兩個棧的棧頂元素時,先創(chuàng)建兩個int變量來接納兩個棧頂元素,然后讓這兩個變量對比。具體代碼如下👇:
import java.util.*;class MinStack {public Stack<Integer> stack = new Stack<>();public Stack<Integer> minStack = new Stack<>();public MinStack() {}public void push(int val) {if(minStack.empty()){minStack.push(val);}else{if(val<=minStack.peek()){minStack.push(val);}}stack.push(val);}public void pop() {int stackNum = stack.peek();int minStackNum = minStack.peek();if(stackNum==minStackNum){ //這里不能直接寫成stack.peek()==minStack.peek(),原因是因為Integer在【-128~128)內(nèi)的對象地址相同,范圍外是不相等的stack.pop();minStack.pop();}else{stack.pop();}}//還未寫的函數(shù)暫時省略 }🍃top函數(shù):
該函數(shù)沒有什么特殊,只需要直接peek出stack的棧頂元素即可。具體代碼如下👇:
import java.util.*;class MinStack {public Stack<Integer> stack = new Stack<>();public Stack<Integer> minStack = new Stack<>();public MinStack() {}public void push(int val) {if(minStack.empty()){minStack.push(val);}else{if(val<=minStack.peek()){minStack.push(val);}}stack.push(val);}public void pop() {int stackNum = stack.peek();int minStackNum = minStack.peek();if(stackNum==minStackNum){ //這里不能直接寫成stack.peek()==minStack.peek(),原因是因為Integer在【-128~128)內(nèi)的對象地址相同,范圍外是不相等的stack.pop();minStack.pop();}else{stack.pop();}}public int top() {return stack.peek();}}🍃getMin函數(shù):
該函數(shù)沒有什么特殊,只需要直接peek出minStack的棧頂元素即可。具體代碼如下👇:
import java.util.*;class MinStack {public Stack<Integer> stack = new Stack<>();public Stack<Integer> minStack = new Stack<>();public MinStack() {}public void push(int val) {if(minStack.empty()){minStack.push(val);}else{if(val<=minStack.peek()){minStack.push(val);}}stack.push(val);}public void pop() {int stackNum = stack.peek();int minStackNum = minStack.peek();if(stackNum==minStackNum){ //這里不能直接寫成stack.peek()==minStack.peek(),原因是因為Integer在【-128~128)內(nèi)的對象地址相同,范圍外是不相等的stack.pop();minStack.pop();}else{stack.pop();}}public int top() {return stack.peek();}public int getMin() {return minStack.peek();} }以上,便是全部代碼啦😎讓我們來運行下逝逝吧~
nice😎?
總結(jié)
以上是生活随笔為你收集整理的LeetCode第155题—最小栈的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 情迁QQ机器人执行SQL以及变量技巧详解
- 下一篇: Hot_s 三子一线棋