LeetCode 题解工作台

最小栈

设计一个支持 push , pop , top 操作,并能在常数时间内检索到最小元素的栈。 实现 MinStack 类: MinStack() 初始化堆栈对象。 void push(int val) 将元素val推入堆栈。 void pop() 删除堆栈顶部的元素。 int top() 获取堆栈顶部…

category

2

题型

code_blocks

8

代码语言

hub

3

相关题

当前训练重点

中等 · 栈·状态

bolt

答案摘要

我们用两个栈来实现,其中 `stk1` 用来存储数据,`stk2` 用来存储当前栈中的最小值。初始时,`stk2` 中存储一个极大值。 - 当我们向栈中压入一个元素 时,我们将 压入 `stk1`,并将 `min(x, stk2[-1])` 压入 `stk2`。

Interview AiBox logo

Interview AiBox 实时 AI 助手,陪你讲清 栈·状态 题型思路

试试 AiBox 面试助手arrow_forward
description

题目描述

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

实现 MinStack 类:

  • MinStack() 初始化堆栈对象。
  • void push(int val) 将元素val推入堆栈。
  • void pop() 删除堆栈顶部的元素。
  • int top() 获取堆栈顶部的元素。
  • int getMin() 获取堆栈中的最小元素。

 

示例 1:

输入:
["MinStack","push","push","push","getMin","pop","top","getMin"]
[[],[-2],[0],[-3],[],[],[],[]]

输出:
[null,null,null,null,-3,null,0,-2]

解释:
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.getMin();   --> 返回 -3.
minStack.pop();
minStack.top();      --> 返回 0.
minStack.getMin();   --> 返回 -2.

 

提示:

  • -231 <= val <= 231 - 1
  • poptopgetMin 操作总是在 非空栈 上调用
  • pushpoptop, and getMin最多被调用 3 * 104 次
lightbulb

解题思路

方法一:双栈

我们用两个栈来实现,其中 stk1 用来存储数据,stk2 用来存储当前栈中的最小值。初始时,stk2 中存储一个极大值。

  • 当我们向栈中压入一个元素 xx 时,我们将 xx 压入 stk1,并将 min(x, stk2[-1]) 压入 stk2
  • 当我们从栈中弹出一个元素时,我们将 stk1stk2 的栈顶元素都弹出。
  • 当我们要获取当前栈中的栈顶元素时,我们只需要返回 stk1 的栈顶元素即可。
  • 当我们要获取当前栈中的最小值时,我们只需要返回 stk2 的栈顶元素即可。

每个操作的时间复杂度为 O(1)O(1)。整体的空间复杂度为 O(n)O(n),其中 nn 为栈中元素的个数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class MinStack:
    def __init__(self):
        self.stk1 = []
        self.stk2 = [inf]

    def push(self, val: int) -> None:
        self.stk1.append(val)
        self.stk2.append(min(val, self.stk2[-1]))

    def pop(self) -> None:
        self.stk1.pop()
        self.stk2.pop()

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

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


# Your MinStack object will be instantiated and called as such:
# obj = MinStack()
# obj.push(val)
# obj.pop()
# param_3 = obj.top()
# param_4 = obj.getMin()
speed

复杂度分析

指标
时间Depends on the final approach
空间Depends on the final approach
psychology

面试官常问的追问

外企场景
  • question_mark

    Looking for efficient O(1) time complexity for all operations.

  • question_mark

    Check if the candidate handles the edge cases when the stack becomes empty.

  • question_mark

    Evaluate if the solution maintains stack synchronization properly, particularly with respect to the minimum tracking.

warning

常见陷阱

外企场景
  • error

    Incorrect handling of stack underflow, especially for pop and getMin operations.

  • error

    Failure to maintain the correct minimum values when elements are popped.

  • error

    Confusion about how to manage two stacks or how to update the minimum value stack.

swap_horiz

进阶变体

外企场景
  • arrow_right_alt

    Implementing a stack that supports additional operations like peek.

  • arrow_right_alt

    Designing a thread-safe version of the MinStack for concurrent operations.

  • arrow_right_alt

    Optimizing space by reducing auxiliary stack usage while maintaining O(1) time complexity.

help

常见问题

外企场景

最小栈题解:栈·状态 | LeetCode #155 中等