实现一个最小栈,具有入栈、出栈、获取最小元素方法,同时要求这三个方法时间复杂度为O(1)
思路:
1. 创建两个栈,栈 A、栈 B (辅助栈)
2. 当第一个元素进入栈 A 时,同时也进入栈 B,这个元素即为当前最小元素
3. 之后每一个元素进入栈 A,同时和 栈B 的栈顶比较大小,如果小于,则同时也入栈B
4. 如果栈 A 出栈,则出栈元素和 栈 B 的栈顶比较,如果相同,则栈 B 的栈顶出栈
5. 栈 B 的栈顶元素即为最小元素
实现代码
class MinStack {
mainStack:Array<number>
auxStack:Array<number>
constructor() {
this.mainStack = [];
this.auxStack = []
}
push(element: number) {
if(!this.auxStack.length || element < this.getMin()) {
this.auxStack.push(element)
}
this.mainStack.push(element)
}
getMin():number {
if(!this.auxStack) {
throw new Error('stack is empty')
}
return this.auxStack[this.auxStack.length -1 ]
}
pop(){
if(!this.mainStack) {
throw new Error('stack is empty')
}
let element = this.mainStack.pop()
if(element === this.getMin()) {
this.auxStack.pop()
}
}
}
function main() {
let stack = new MinStack();
stack.push(4);
stack.push(9);
stack.push(7);
stack.push(3);
stack.push(8);
stack.push(5);
console.log(stack.getMin())
stack.pop()
console.log(stack.getMin())
stack.pop()
console.log(stack.getMin())
stack.pop()
console.log(stack.getMin())
}
main()
摘要总结自: 漫画算法 小灰的算法之旅