zoukankan      html  css  js  c++  java
  • LeetCode 155:最小栈 Min Stack

    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]
    

    在这里插入图片描述

  • 相关阅读:
    MySQL实战45讲学习笔记:第二十四讲
    MySQL实战45讲学习笔记:第二十六讲
    MySQL实战45讲学习笔记:第二十三讲
    MySQL实战45讲学习笔记:第二十一讲
    MySQL实战45讲学习笔记:第二十二讲
    MySQL实战45讲学习笔记:第十七讲
    MySQL实战45讲学习笔记:第十四讲
    MySQL实战45讲学习笔记:第十三讲
    Web协议详解与抓包实战:HTTP1协议-内容协商是怎样进行的(8)
    Web协议详解与抓包实战:HTTP1协议-请求与响应的上下文(7)
  • 原文地址:https://www.cnblogs.com/zhangzhe532/p/11281814.html
Copyright © 2011-2022 走看看