📜  门| GATE-CS-2016(Set 1)|问题13(1)

📅  最后修改于: 2023-12-03 14:58:30.878000             🧑  作者: Mango

介绍Gate-CS-2016(Set1)问题13

这道问题需要实现一个类似栈的数据结构,并支持查询最小值。以下是具体要求和解题思路。

问题描述

请实现一个能够支持以下操作的数据结构:

  • 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]

以上就是本题的解题思路和代码实现,感谢阅读!