10
04/2015
[LeetCode] Min Stack
Min Stack
Design a stack that supports push, pop, top, and retrieving the minimum element in constant time.
push(x) -- Push element x onto stack.
pop() -- Removes the element on top of the stack.
top() -- Get the top element.
getMin() -- Retrieve the minimum element in the stack.
解题思路:
主要是获得当前最小值的问题。我们可以用一个动态数组min存储当前最小值。若新压入的元素大于动态数组min最后一个元素,不做任何操作。否则(小于或等于)就压入min中。出栈的时候,若出栈元素等于min最后一个元素,则min数组出栈。这样便实现了常量时间找到栈中的最小值了。下面是代码:
class MinStack { public: MinStack(){ capcity=2; data = new int[capcity]; size=0; minCapcity=2; min = new int[minCapcity]; minSize = 0; } ~MinStack(){ delete[] data; delete[] min; } void push(int x) { if(size>=capcity){ int* p=data; capcity = 2*capcity; data=new int[capcity]; std::memcpy(data, p, sizeof(int)*size); delete[] p; } data[size++]=x; if(minSize==0){ min[minSize++]=x; }else if(min[minSize-1]>=x){ if(minSize>=minCapcity){ int* p=min; minCapcity = 2*minCapcity; min = new int[minCapcity]; std::memcpy(min, p, sizeof(int)*minSize); delete[] p; } min[minSize++]=x; } } void pop() { if(size>0){ size--; if(data[size]==min[minSize-1]){ minSize--; } }else{ throw exception(); } } int top() { if(size>0){ return data[size-1]; }else{ throw exception(); } } int getMin() { return min[minSize-1]; } private: int size; int capcity; int* min; int minSize; int minCapcity; int* data; };
二次刷题(2015-08-05)
同样的思路。注意min栈存储的是一个递减序列,栈顶是当前栈中最小的值。这样,每个操作其实都能够在常量时间完成。
class MinStack { public: void push(int x) { ss.push(x); if(min.empty() || x<=min.top()){ min.push(x); } } void pop() { int x = ss.top(); ss.pop(); if(x==min.top()){ min.pop(); } } int top() { return ss.top(); } int getMin() { return min.top(); } private: stack<int> min; stack<int> ss; };
转载请注明:康瑞部落 » [LeetCode] Min Stack
0 条评论