剑指 Offer 30. 包含min函数的栈
题意
剑指 Offer 30. 包含min函数的栈
解法
这一题主要就是考虑怎么维护最小元素的位置。
进栈的时候情况比较简单,若发生交换一定是进栈的元素
出栈的时候情况比较复杂,因为如果出栈的元素是最小的元素,则需要找出第二小的元素更新最小元素的位置。这里采用了遍历剩余元素的方法找出最小的元素。
优化:在出栈的时候比较出栈元素和最小元素。 若出栈元素>最小元素,则最小元素位置不变,跳过遍历过程。 若出栈元素=最小元素,则需要进行遍历获取剩余元素中的最小元素。
代码
/**
* initialize your data structure here.
*/
var MinStack = function() {
this.arr = [] // 用数组模拟栈
this.stackTop = 0 // 记录栈顶的位置
this.minIndex = 0 // 记录最小元素的位置
};
/**
* @param {number} x
* @return {void}
*/
MinStack.prototype.push = function(x) {
this.arr[this.stackTop++] = x
// 在元素进栈的时候更新最小元素的位置
if(x<this.arr[this.minIndex])this.minIndex = this.stackTop-1
};
/**
* @return {void}
*/
MinStack.prototype.pop = function() {
if (this.stackTop > 0) {
this.stackTop--;
// 在元素出栈的时候更新最小元素的位置
if (this.stackTop === 0) {
this.minIndex = 0;
} else {
// 若栈不为空,遍历获取最小元素的位置
let tep = 0;
for (let i = 0; i < this.stackTop; i++) {
if (this.arr[i] < this.arr[tep]) {
tep = i
}
}
this.minIndex = tep
}
}
return null;
};
/**
* @return {number}
*/
MinStack.prototype.top = function() {
return this.arr[this.stackTop-1]
};
/**
* @return {number}
*/
MinStack.prototype.min = function() {
return this.stackTop===0?undefined:this.arr[this.minIndex]
};
/**
* Your MinStack object will be instantiated and called as such:
* var obj = new MinStack()
* obj.push(x)
* obj.pop()
* var param_3 = obj.top()
* var param_4 = obj.min()
*/