题目描述
定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。
题目示例
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.min(); --> 返回 -3.
minStack.pop();
minStack.top(); --> 返回 0.
minStack.min(); --> 返回 -2.
题目解析
定义栈的数据结构,首先想到栈的特点(FILO),同时题干中描述的min、push、pop方法的时间复杂度都是O(1),第一时间想到的肯定是使用对象来存储,通过key进行查找,将时间复杂度降为O(1),这个是最简单的方式。
代码实现
const Stack = function() {
// 定义对象, 用来存储数据
this.items = {}
// 定义计数器,用来计算数据长度或大小
this.count = 0
// 用来保存最小值
this.minItem = null
}
Stack.prototype.push = function(val) {
// 判断最小值是否为空
if (this.minItem === null) {
this.minItem = val
} else {
// 取最小值
this.minItem = Math.min(this.minItem, val)
}
this.items[this.count] = val
// 计数器自增
this.count++
}
Stack.prototype.pop = function() {
// 出栈操作,result保存栈顶元素(即将出栈的元素)
const result = this.items[this.count - 1]
delete this.items[this.count - 1]
this.count--
// 出栈元素为最小值,则重新计算最小值
if (result === this.minItem) {
this.minItem = Math.min(...Object.values(this.items))
}
}
Stack.prototype.min = function() {
return this.minItem
}
Stack.prototype.top = function() {
return this.items[this.count - 1]
}
const stack = new Stack()
stack.push(-2)
stack.push(0)
stack.push(-3)
console.log(stack.min())
stack.pop()
console.log(stack.top())
console.log(stack.min())
题目来源
力扣(LeetCode) 链接:leetcode-cn.com/problems/ba…
思路来源
学习JavaScript数据结构与算法(第3版) 第四章 栈