看起來挺簡單,但是寫起來才有坑。
模仿java里面的棧
1、用數組存放元素
2、設置size和index,push和pop只需要移動index就好了,不需要處理元素。
3、初始化為16,如果滿了要擴容到2倍,為了偷懶,數組只增不減。
最后就是處理min的問題,原來想着提供一個min變量,每次插入的時候更新min即可。
但是如果剛好pop了一個min呢?上一個min是多少?
當然可以使用一個secondMin變量,但是連續pop兩個呢?上上個呢?
所以使用變量不行。
因為只需要在獲取的時候是常數,維護min不做限制,那么使用優先隊列就好了。
注意在pop的時候,要注意pop的是不是最小值,是的話有限隊列也要poll
沒進行出錯處理,比如pop到負數,但是題目本身也沒這樣的操作。過了
class MinStack { int size; int index; //只有一個min,或者兩個min,不能實現該功能 //如果pop了一個min,沒法獲取之前的最小值了 //使用最小堆就好了 PriorityQueue<Integer> min; int [] array; /** initialize your data structure here. */ // 初始化給16 public MinStack() { size = 16; index = 0; array = new int [16]; min = new PriorityQueue<>(); } public void push(int x) { //擴容 if(index==size-1){ size*=2; int [] temp = new int [size]; int ori = size/2; for(int i=0;i<ori;i++){ temp[i]=array[i]; } array = temp; } array[index++]=x; min.add(x); } public void pop() { int temp = array[--index]; //如果pop掉的是最小值,那么隊列也要刪掉一個最小值 if(temp==getMin()){ min.poll(); } } public int top() { return array[index-1]; } public int getMin() { return min.peek(); } }
排第一的答案很有趣!是自定義的數據結構來維護min值!
使用了一個棧來保存Pair
Pair是當前值val對應的min值
每次push的時候更新min值,然后創建Pair,壓棧
因為用的是棧,就算是同一個數字,后入和先入的也能區分不同的min。
而且這個棧st和題目要求的棧剛好可以同步pop,也算巧妙吧!