「一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第1天,点击查看活动详情。」
题目
设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。
实现 MinStack 类:
-
MinStack() 初始化堆栈对象。
-
void push(int val) 将元素val推入堆栈。
-
void pop() 删除堆栈顶部的元素。
-
int top() 获取堆栈顶部的元素。
-
int getMin() 获取堆栈中的最小元素。
示例 1:
输入:
["MinStack","push","push","push","getMin","pop","top","getMin"]
[[],[-2],[0],[-3],[],[],[],[]]
输出:
[null,null,null,null,-3,null,0,-2]
「解释:」
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.getMin(); --> 返回 -3.
minStack.pop();
minStack.top(); --> 返回 0.
minStack.getMin(); --> 返回 -2.
『提示:』
-
-231 <= val <= 231 - 1
-
pop、top 和 getMin 操作总是在 非空栈 上调用
-
push, pop, top, and getMin最多被调用 3 * 104 次
解题思路
方法一: 辅助栈(利用数组原有方法)
需要设计一个数据结构,使得每个元素 a 与其相应的最小值 m 时刻保持一一对应。
因此我们可以使用一个辅助栈,与元素栈同步插入与删除,用于存储与每个元素对应的最小值。
当一个元素要入栈时,我们取当前辅助栈的栈顶存储的最小值,与当前元素比较得出最小值,将这个最小值插入辅助栈中;
当一个元素要出栈时,我们把辅助栈的栈顶元素也一并弹出;
在任意一个时刻,栈内元素的最小值就存储在辅助栈的栈顶元素中。
var MinStack = function() {
this.stackArr = new Array();
this.minArr = new Array();
};
/**
* @param {number} val
* @return {void}
*/
MinStack.prototype.push = function(val) {
this.stackArr.push(val);
this.minArr.push(Math.min(...this.stackArr));
};
/**
* @return {void}
*/
MinStack.prototype.pop = function() {
this.stackArr.pop();
this.minArr.pop();
};
/**
* @return {number}
*/
MinStack.prototype.top = function() {
return this.stackArr[this.stackArr.length-1];
};
/**
* @return {number}
*/
MinStack.prototype.getMin = function() {
return this.minArr[this.minArr.length - 1];
};
/**
* Your MinStack object will be instantiated and called as such:
* var obj = new MinStack()
* obj.push(val)
* obj.pop()
* var param_3 = obj.top()
* var param_4 = obj.getMin()
*/
结束语
这里是小葵🌻,只要把心朝着太阳的地方,就会有温暖~
让我们一起来攻克算法难关吧!!