返回

剖析Leetcode 155题:最小栈的两种解决思路

前端

前言

在计算机科学中,栈是一种重要的数据结构。栈遵循后进先出的原则,即最后加入栈中的元素最先被移除。在许多应用中,我们需要维护一个有序栈,即能够在 O(1) 时间内访问最小元素的栈。

问题背景和要求

Leetcode 155 题:最小栈要求我们设计一个支持以下操作的栈:

  • push(x):将元素 x 压入栈顶。
  • pop():移除并返回栈顶元素。
  • top():返回栈顶元素,但不移除它。
  • getMin():返回栈中的最小元素。

两种解题思路

思路一:辅助栈

思路一利用辅助栈来维护最小元素。辅助栈始终存储栈中的最小元素。当我们调用 push() 方法时,我们将元素 x 压入栈顶,并检查 x 是否小于辅助栈栈顶元素。如果 x 更小,我们将 x 压入辅助栈。当我们调用 pop() 方法时,我们将栈顶元素弹出,并检查辅助栈栈顶元素是否等于栈顶元素。如果相等,我们将辅助栈栈顶元素弹出。当我们调用 top() 方法时,我们返回栈顶元素。当我们调用 getMin() 方法时,我们返回辅助栈栈顶元素。

思路二:差值记录

思路二不使用辅助栈,而是通过记录每个元素与当前最小元素的差值来维护最小元素。当我们调用 push() 方法时,我们将元素 x 压入栈顶,并计算 x 与当前最小元素的差值。我们将在栈中存储这个差值。当我们调用 pop() 方法时,我们将栈顶元素弹出,并将栈顶元素对应的差值从栈中弹出。当我们调用 top() 方法时,我们返回栈顶元素。当我们调用 getMin() 方法时,我们将栈顶元素对应的差值加到当前最小元素上,以得到当前的最小元素。

优缺点比较

思路一和思路二都是解决 Leetcode 155 题:最小栈的有效方法。思路一使用辅助栈来维护最小元素,实现简单,但空间复杂度为 O(n)。思路二不使用辅助栈,而是通过记录每个元素与当前最小元素的差值来维护最小元素,实现更加简洁,但需要更复杂的计算。

额外资源和建议

如果您想了解更多有关 Leetcode 155 题:最小栈的解法,可以参考上述资源。如果您在解决这个问题时遇到困难,也可以在评论区留言,我会尽力帮助您。