定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。
看到题先不管三七二十一暴力开解,最后以min函数不满足o(1)复杂度收场。
class MinStack:
def __init__(self):
"""
initialize your data structure here.
"""
self.stack = []
def push(self, x: int) -> None:
# 入栈
self.stack.append(x)
def pop(self) -> None:
self.stack.pop()
def top(self) -> int:
return self.stack[-1]
def min(self) -> int:
min_num = 0
for i in self.stack:
if i < min_num:
min_num = i
return min_num
在暴力解法中,min里用了个循环,直接导致时间复杂度飙升,如果想保持o(1)的时间复杂度,就得牺牲空间复杂度了,定义一个工具人栈2,只要能保持栈2的顶部元素一直是最小的那个,就能实现o(1)的min方法了。
class MinStack:
def __init__(self):
"""
initialize your data structure here.
"""
self.stack1 = []
self.stack2 = []
def push(self, x: int) -> None:
# 入栈
self.stack1.append(x)
if not self.stack2 or self.stack2[-1] >= x:
self.stack2.append(x)
def pop(self) -> None:
if self.stack1.pop() == self.stack2[-1]:
self.stack2.pop()
def top(self) -> int:
return self.stack1[-1]
def min(self) -> int:
return self.stack2[-1]