時間限制: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];
}
};