在计算机科学和编程领域,数据结构在有效地解决复杂问题方面起着关键作用。一个这样的问题是设计一个名为Minstack的专业堆栈。此堆栈不仅支持标准推动和弹出操作,而且还提供了对堆栈中最小元素的恒定访问。在此博客中,我们将探索JavaScript中MinStack的巧妙实现,该实现符合每个功能的严格O(1)时间复杂性要求。
Leetcode Question
了解问题
问题语句要求设计一个支持以下操作的MINSTACK:
push(val):在堆栈顶部添加一个元素。
pop():从堆栈顶部删除元素。
top():返回堆栈顶部的元素。
getmin():检索堆栈中的最小元素。
这里的关键挑战是在恒定时间O(1)执行所有这些操作时有效地保持最小元素。
。MINSTACK实现
要实现MinStack,我们可以使用两个单独的堆栈:
主要堆栈:此堆栈以将它们推到堆栈上的顺序中。
最小堆栈:此堆栈跟踪每个步骤遇到的最小元素。
让我们逐步分解实现:
初始化
class MinStack {
constructor() {
this.stack = [];
this.minStack = [];
}
}
我们初始化两个空数组,堆栈和米斯塔克,以保存我们的数据。
推动操作
push(val) {
// If the minStack is empty or the new value is smaller than or equal to the current minimum,
// push the new value onto the minStack.
if (this.minStack.length === 0 || val <= this.minStack[this.minStack.length - 1]) {
this.minStack.push(val);
}
// Push the new value onto the main stack.
this.stack.push(val);
}
将新值推向堆栈时,我们将其与MinStack中存储的当前最小值进行了比较。如果新值小于或等于当前最小值,我们也将其推到MinStack上。这样可以确保我们始终在MinStack的顶部具有正确的最小值。
流行操作
pop() {
// Retrieve the top elements from both stacks.
const stackTop = this.stack.pop();
const minStackTop = this.minStack[this.minStack.length - 1];
// If the top elements are equal, pop from the minStack as well.
if (stackTop === minStackTop) {
this.minStack.pop();
}
}
从主堆栈中弹出元素时,我们将其与MinStack的顶部元素进行比较。如果它们相等,则意味着最小元素正在删除,因此我们也从MinStack中弹出。
顶部(窥视)操作
top() {
return this.stack[this.stack.length - 1];
}
top()函数只需返回堆栈顶部的元素。
Getmin操作
getMin() {
return this.minStack[this.minStack.length - 1];
}
getmin()函数返回MinStack的顶部元素,这是任何给定点堆栈中的最小值。
结论
在这篇博客文章中,我们探索了MinStack的概念,Minstack是一个专门支持PUSH,POP,POP,TOP和检索最小元素等操作的专业堆栈,这些堆栈都是在恒定时间内的。通过使用两个单独的堆栈,即主堆栈和最小堆栈,我们可以在执行其他操作的同时保持最小元素,而无需牺牲效率。这种优雅的解决方案展示了巧妙的数据结构设计如何在解决现实世界中的问题方面进行显着的绩效改进。