力扣刷题Python笔记:最小栈

题目

设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。

  • push(x) —— 将元素 x 推入栈中。
  • pop() —— 删除栈顶的元素。
  • top() —— 获取栈顶元素。
  • getMin() —— 检索栈中的最小元素。
    力扣刷题Python笔记:最小栈_第1张图片

提示:

  • pop、top 和 getMin 操作总是在 非空栈 上调用。

来源:力扣(LeetCode)

Python解法

这道题用的是“备用”栈解法,即除了原来存放数组的栈(主栈)以外,我们还定义了一个最小栈用来存放当前数组的最小值。

具体的解题思路如下:
①当第一个元素放入主栈时,将其也放入最小栈,表示当前主栈最小值就是该元素;
②以后再将元素放入主栈时,将其与最小栈最后一个值进行比较,如果该元素不大于最小栈最后一个元素,将该元素也顺便压入最小栈;
③删除栈顶元素时,如果该元素与最小栈最后一个元素相同,删除最小栈最后一个元素,确保同时更新当前主栈最小值;
④获取栈顶元素——即获取主栈最后一个元素,检索栈中的最小元素——即获取最小栈最后一个元素。

代码如下:

class MinStack:
    def __init__(self):
        self.main_stack = []
        self.min_stack = []

    def push(self, x: int) -> None:
        self.main_stack.append(x)
        if (not self.min_stack) or (x <= self.min_stack[-1]):
            self.min_stack.append(x)

    def pop(self) -> None:
        x = self.main_stack.pop()
        if x == self.min_stack[-1]:
            self.min_stack.pop()

    def top(self) -> int:
        return self.main_stack[-1]

    def getMin(self) -> int:
        return self.min_stack[-1]

你可能感兴趣的:(力扣python刷题,栈)