看到这个最小堆的解题思路,这里自己练习着实现下细节。
主要思路就是两个栈,数据栈是保存原始数据的,另外一个辅助栈的栈顶元素保存当前数据栈中最小元素。
所以获取最小元素就直接读取辅助栈栈顶元素即可,同时数据栈的进栈、出栈的时候要维护辅助栈的栈顶的元素,以同步更新最小元素。
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)//非空的时候才pop
curMin--;
}
arr[curIdx] = 0;
curIdx--;
}
}
int top() {
if(curIdx > -1)//非空的时候才top
return arr[curIdx];
else
return -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来替代以简化掉自动扩容的逻辑。