LeetCode155-最小棧(優先隊列/巧妙的解法)


看起來挺簡單,但是寫起來才有坑。

模仿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,也算巧妙吧!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM