包含min函數的棧-最小堆的插入、刪除(調整)

時間限制:C/C++ 1秒,其他語言2秒 空間限制:C/C++ 32M,其他語言64M 熱度指數:448024

本題知識點: 

 算法知識視頻講解

題目描述

定義棧的數據結構,請在該類型中實現一個能夠得到棧中所含最小元素的min函數(時間複雜度應爲O(1))。

注意:保證測試中不會當棧爲空的時候,對棧調用pop()或者min()或者top()方法。

解答:

class Solution {
private:
    int stop;
    int s[2000];
    vector<int>heap;
    vector<int>stack;
public:
    Solution(){
        stop=0;
        stack.push_back(-1);
        heap.push_back(INT_MAX);
        //#include<limits.h>
        //#define INT_MAX 2147483647
        //#define INT_MIN (-INT_MAX - 1)

    }
    void BuildMinHeap(int max){
        for(int i=max/2;i>=1;i--){
            AdjustUp(heap,i,max);
            //max是最大下標。
            //注意,i從1開始!
        }
    }//這是將普通二叉樹調整爲堆的過程,是調整,不是創建堆。
    void AdjustUp(vector<int>&s,int st,int maxi){
        s[0]=s[st];
        int i=0;
        for(i=2*st;i<=maxi;i=i*2){
            if(maxi>=i+1){
                if(s[i]>s[i+1]){
                    i++;
                }
            }
            if(s[i]<s[0]){
                s[i/2]=s[i];
            }else{
                break;
            }
        }
        s[i/2]=s[0];
    }//這是將普通二叉樹調整爲堆的過程,是調整,不是創建堆。
    
    void insert(int bottomi){
        int num=heap[bottomi];
        int k=bottomi/2;
        while(heap[k]>num&&k>0){
            heap[bottomi]=heap[k];
            bottomi=k;
            k=k/2;
        }
        heap[bottomi]=num;
    }//這是從零開始創建堆的過程。
    
    void deletenum(int value){
        int num=0;
        for(int i=heap.size()-1;i>=1;i--){
            if(heap[i]==value){
                num=i;
            }
        }
        int temp=0;
        for(int i=num;i<=heap.size()-2;i++){
            heap[i]=heap[i+1];
        }
        heap.pop_back();
        BuildMinHeap(heap.size()-1);
    }
    void push(int value) {
        stop++;
        stack.push_back(value);
        heap.push_back(value);
        insert(heap.size()-1);
        
    }
    void pop() {
        if(stack.empty())
            return;
        deletenum(stack.back());
        stack.pop_back();
    }
    int top() {
        if(stack.empty())
            return -1;
        return stack.back();
    }
    int min() {
        if(stack.empty())
            return -1;
        return heap[1];
    }
};

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章