定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的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.
这道题的难点显然是如果保证时间复杂度O(1),尤其是min函数的时间复杂度是O(1).
思路1 Python自带函数
Python中的list是有自带min函数的,通过使用自带min函数完成该题目。
Note:这种方法虽然能够通过,但严格来说是错误的,原因如下:
- 时间复杂度不是O(1). Python的内置函数min()的时间复杂度其实是O(n),但leetcode毕竟是在线平台,难免会检测错误从而不报错;
- 开挂可耻。
代码
class MinStack:
def __init__(self):
"""
initialize your data structure here.
"""
self.A = []
def push(self, x: int) -> None:
self.A.append(x)
def pop(self) -> None:
self.A.pop()
def top(self) -> int:
return self.A[-1]
def min(self) -> int:
return min(self.A)
# Your MinStack object will be instantiated and called as such:
# obj = MinStack()
# obj.push(x)
# obj.pop()
# param_3 = obj.top()
# param_4 = obj.min()
结果
作为取巧的答案,结果自然不好。
思路2 辅助栈
这里的min之所以能够做到O(1)的复杂度,是因为每一个元素都是push进去的,因此可以在push的时候利用辅助栈完成排序,从而减低min的时间复杂度至O(1).
数据栈A:与思路1一样,作为主数据栈,采取正常逻辑,完成push pop 和top功能;
辅助栈B:存储A的最小元素,在push时完成,负责min功能。
代码
class MinStack:
def __init__(self):
"""
initialize your data structure here.
"""
self.A = []
self.B = []
def push(self, x: int) -> None:
self.A.append(x)
# 错误代码
# if not self.B:
# self.B.append(x)
# if self.B[-1] >= x: # 如果x是最小的
# self.B.append(x)
if not self.B or self.B[-1] >=x:
self.B.append(x)
def pop(self) -> None:
popNum = self.A.pop()
if popNum == self.B[-1]:
self.B.pop()
def top(self) -> int:
return self.A[-1]
def min(self) -> int:
return self.B[-1]
# Your MinStack object will be instantiated and called as such:
# obj = MinStack()
# obj.push(x)
# obj.pop()
# param_3 = obj.top()
# param_4 = obj.min()