为了账号安全,请及时绑定邮箱和手机立即绑定

LeetCode 155:最小栈 Min Stack

标签:
Java Python 算法

LeetCode 155:最小栈 Min Stack

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

  • push(x) – 将元素 x 推入栈中。
  • pop() – 删除栈顶的元素。
  • top() – 获取栈顶元素。
  • getMin() – 检索栈中的最小元素。

Design a stack that supports push, pop, top, and retrieving the minimum element in constant time.

  • push(x) – Push element x onto stack.
  • pop() – Removes the element on top of the stack.
  • top() – Get the top element.
  • getMin() – Retrieve the minimum element in the stack.

示例:

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

解题思路:

起初我以为定义一个指针指向最小值即可,后面才想到在栈中弹出元素时,如果弹出的元素是最小值,那这个指针就需要更 改选择另一个最小元素。没办法,想做到入栈出栈和弹出最小值均为 O(1) 的时间复杂度,那么只能牺牲空间来换。可以另外新建一个栈来顺序存入数据最小值。

注意:Python中没有单独的 Stack 数据结构,其实它的数组就有弹出和压入功能。也可以用 collections.deque() 数据结构。 另外在数据入栈时需要判断该值是否比辅助栈的栈顶元素的值更小,如果更小,也应该将它加入辅助栈。并且需要判断辅助栈是否为空,在不空的条件下才可以取栈顶元素比较,否则会溢出。

事实上每次都要调用函数判断是否为空这个操作,相对这道题的运行时间来说很耗时,就这道题而言是可以避免的,只需给辅助栈加入整型最大值作为栈底元素即可。

Java:

class MinStack {
    Stack<Integer> s1 = new Stack<>();//初始化栈
    Stack<Integer> s2 = new Stack<>();//辅助栈顺序存入最小值

    public MinStack() {
        s2.push(Integer.MAX_VALUE);//先加入整型最大值在栈底,避免判断辅助栈是否为空
    }

    public void push(int x) {
        s1.push(x);
        if (s2.peek() >= x) s2.push(x);//比栈顶元素值小或相等就加入辅助栈
    }

    public void pop() {
        int tmp = s1.pop();
        if (tmp == s2.peek()) s2.pop();//弹出栈的元素值如果和辅助栈顶元素值相等,也在辅助栈弹出它
    }

    public int top() {
        return s1.peek();//返回栈顶元素
    }

    public int getMin() {
        return s2.peek();//返回辅助栈栈顶元素即是最小值
    }
}

Python3:

class MinStack:
	#初始化数据结构(数组),s2作为辅助栈加入整形最大值做栈底,避免判断辅助栈是否为空
    def __init__(self):
        self.s1 = []
        self.s2 = []
        self.s2.append(sys.maxsize)

    def push(self, x: int) -> None:
        self.s1.append(x)
        #取栈顶元素直接用数组负值索引 Array[-1] 取最后一个值
        if self.s2[-1] >= x: self.s2.append(x)

    def pop(self) -> None:
        tmp = self.s1.pop()
        if tmp == self.s2[-1]: self.s2.pop()

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

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

欢迎关注:爱写Bug

点击查看更多内容
1人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
算法工程师
手记
粉丝
17
获赞与收藏
43

关注作者,订阅最新文章

阅读免费教程

感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消