题目描述:
定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 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.
提示:各函数的调用总次数不超过 20000 次
辅助list法: 使用stack来构建栈,使用minNum来存放曾经出现过的最小的元素。
- 入栈时将元素添加到stack中,如果入栈的元素小于minNum[-1],即当前最小的元素,则将其添加到minNum中
- 出栈时,如果当前栈顶的元素等于当前最小元素,即minNum[-1],则需要从minNum中进行移除,然后再进行出栈
- 栈中最小的元素即minNum[-1]
class MinStack:
def __init__(self):
"""
initialize your data structure here.
"""
self.stack = []
self.m = []
def push(self, x: int) -> None:
self.stack.append(x)
if self.m == [] or x <= self.m[-1] :
self.m.append(x)
def pop(self) -> None:
if self.stack == []:
return None
if self.top() == self.m[-1]:
self.m.pop()
return self.stack.pop()
def top(self) -> int:
return self.stack[-1]
def min(self) -> int:
if self.stack == []:
return 0
print(self.m)
return self.m[-1]
索引法:设置一个变量表示当前栈中最小的元素对应的索引minNum
- 入栈时,如果入栈的元素小于minNum指向的元素则更新minNum,否则不变
- 出栈时,如果minNum指向的元素位于栈顶,首先找到除栈顶元素外的栈中最小元素的索引并更新minNum,否则直接出栈
- 注意在入栈和出栈时都要更新栈中元素的数量
import sys
class MinStack:
def __init__(self):
self.stack = [sys.maxsize]
self.minNum = 0
self.num = 1
def push(self, node):
self.stack.append(node)
self.num += 1
if self.stack[self.num - 1] < self.stack[self.minNum]:
self.minNum = self.num - 1
def pop(self):
if self.stack == []:
return None
if self.top() == self.stack[self.minNum]:
self.minNum = self.stack.index(min(self.stack[:-1]))
self.num -= 1
return self.stack.pop()
else:
self.num -= 1
return self.stack.pop()
def top(self):
return self.stack[len(self.stack) - 1]
def min(self):
if self.stack == []:
return 0
else:
return self.stack[self.minNum]