📅  最后修改于: 2023-12-03 14:58:30.878000             🧑  作者: Mango
这道问题需要实现一个类似栈的数据结构,并支持查询最小值。以下是具体要求和解题思路。
请实现一个能够支持以下操作的数据结构:
push(x)
:将元素 x 推入栈中。pop()
:删除栈顶的元素。top()
:获取栈顶元素。getMin()
:检索栈中的最小元素。所有操作的时间复杂度都必须是 $O(1)$。
要实现 $O(1)$ 的时间复杂度,可以使用两个栈:
data
用于存储数据;minStack
用于存储最小值。每当向栈中加入一个新元素时,我们需要比较它和当前最小值。如果它更小,则把它加入 minStack
。因此,minStack
的栈顶元素就是整个栈中的最小值。
在弹出元素时,如果栈顶元素恰好是当前最小值,那么我们也需要把 minStack
中的栈顶元素一块弹出。
以下是对于每个操作的具体实现。
push(x)
首先,我们把元素 x
加入到 data
栈中。然后,如果 minStack
是空的或者 x
小于等于栈顶元素,我们把 x
加入到 minStack
里。
def push(self, x):
self.data.append(x)
if not self.minStack or x <= self.minStack[-1]:
self.minStack.append(x)
pop()
当我们弹出元素时,如果弹出的元素恰好是栈中的最小值,那么我们也需要把 minStack
中的栈顶元素一块弹出。
def pop(self):
if not self.data:
return
x = self.data.pop()
if x == self.minStack[-1]:
self.minStack.pop()
return x
top()
这个操作和栈一样,只需要返回 data
栈的栈顶元素即可。
def top(self):
if not self.data:
return
return self.data[-1]
getMin()
这个操作就是返回 minStack
的栈顶元素,也就是当前栈中的最小值。
def getMin(self):
if not self.minStack:
return
return self.minStack[-1]
class MinStack(object):
def __init__(self):
self.data = []
self.minStack = []
def push(self, x):
self.data.append(x)
if not self.minStack or x <= self.minStack[-1]:
self.minStack.append(x)
def pop(self):
if not self.data:
return
x = self.data.pop()
if x == self.minStack[-1]:
self.minStack.pop()
return x
def top(self):
if not self.data:
return
return self.data[-1]
def getMin(self):
if not self.minStack:
return
return self.minStack[-1]
以上就是本题的解题思路和代码实现,感谢阅读!