Min Stack 最小栈

来源:互联网 发布:linux换行 编辑:程序博客网 时间:2024/06/16 09:56

看到这个最小堆的解题思路,这里自己练习着实现下细节。

主要思路就是两个栈,数据栈是保存原始数据的,另外一个辅助栈栈顶元素保存当前数据栈中最小元素

所以获取最小元素就直接读取辅助栈栈顶元素即可,同时数据栈的进栈、出栈的时候要维护辅助栈的栈顶的元素,以同步更新最小元素。

class MinStack {public:/** initialize your data structure here. */MinStack() {curIdx = -1;//初始化arr栈顶索引curMin = -1;//初始aux栈顶索引maxCap = 10;arr = new int[maxCap];memset(arr, 0, maxCap);aux = new int[maxCap];memset(aux, 0, maxCap);}void push(int x) {if(curIdx + 1 >= maxCap){int* arrtmp = new int[maxCap*2];memset(arrtmp, 0, maxCap*2);memcpy(arrtmp, arr, maxCap*sizeof(int));delete arr;arr = arrtmp;int* auxtmp = new int[maxCap*2];memset(auxtmp, 0, maxCap*2);memcpy(auxtmp, aux, maxCap*sizeof(int));delete aux;aux = auxtmp;maxCap *= 2;}arr[++curIdx] = x;if(curMin == -1)aux[++curMin] = x;else if(x <= aux[curMin])aux[++curMin] = x;}void pop() {if(curIdx > -1)//非空的时候才pop{if(arr[curIdx] == aux[curMin]){aux[curMin] = 0;if(curMin  > -1)//非空的时候才popcurMin--;}arr[curIdx] = 0;curIdx--;}}int top() {if(curIdx > -1)//非空的时候才topreturn arr[curIdx];elsereturn -1;}int getMin() {return aux[curMin];}private:/* data structure */int* arr;//当前栈int maxCap; //arr栈的最大容量int curIdx; //arr当前栈顶索引int* aux;//辅助栈int curMin; //aux栈顶索引(arr里面的最小数值)};

在leetcode上有这道题,觉得自己的代码过于冗长,是不是哪里还有优化的地方?

查看solution发现c++解题最高票答案直接使用的是两个stack容器,代码很简洁。不过自己对题目描述的理解,觉得这里的stack还是需要自己来实现的。


当然,数组可以用vector来替代以简化掉自动扩容的逻辑。


原创粉丝点击