zoukankan      html  css  js  c++  java
  • 设计一个有getMin功能的栈

    题目

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

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

    示例:

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

    思路

    设计时使用两个栈
    一个栈用来保存当前栈中的元素,记为stack_data
    一个栈用于保存每一步的最小值,记为stack_min

    方案一

    新元素x入栈

    1.数据x将要入栈,先入栈stack_data

    2.判断栈stack_min是否为空,为空x直接入stack_min,否则判断stack_min栈顶元素和x的大小,如果x小于或者等于栈顶元素,则x入栈stack_min,大于则不做处理

    3.获取栈的最小值则返回stack_min的栈顶元素

    元素出栈

    1.stack_data栈正常弹出栈顶元素y

    2.判断stack_data弹出的元素y与stack_min栈顶元素的大小,如果y等于栈顶元素,则stack_min也弹出栈顶元素

    方案二

    新元素x入栈

    1.数据x将要入栈,先入栈stack_data

    2.判断栈stack_min是否为空,为空x直接入stack_min,否则判断stack_min栈顶元素和x的大小,如果x小于或者等于栈顶元素,则x入栈stack_min,大于的话则把stack_min的栈顶元素重复压入stack_min

    元素出栈

    1.stack_data栈正常弹出栈顶元素y

    2.stack_min栈正常弹出栈顶元素z

    3.获取栈的最小值则返回stack_min的栈顶元素

    代码

    方案一

    class MinStack:
    
        def __init__(self):
            """
            initialize your data structure here.
            """
            self.stack_data = []
            self.stack_min = []
    
        def push(self, x: int) -> None:
            self.stack_data.append(x)
            if self.stack_min:
                if x <= self.stack_min[-1]:
                    self.stack_min.append(x)
            else:
                self.stack_min.append(x)
    
        def pop(self) -> None:
            if self.stack_data and self.stack_min:
                if self.stack_min[-1] == self.stack_data.pop():
                    self.stack_min.pop()
    
        def top(self) -> int:
            if self.stack_data:
                return self.stack_data[-1]
    
        def getMin(self) -> int:
            if self.stack_min:
                return self.stack_min[-1]
    

    方案二

    class MinStack:
    
        def __init__(self):
            """
            initialize your data structure here.
            """
            self.stack_data = []
            self.stack_min = []
    
        def push(self, x: int) -> None:
            self.stack_data.append(x)
            if self.stack_min:
                if x <= self.stack_min[-1]:
                    self.stack_min.append(x)
                else:
                    self.stack_min.append(self.stack_min[-1])
            else:
                self.stack_min.append(x)
    
        def pop(self) -> None:
            if self.stack_data and self.stack_min:
                self.stack_data.pop()
                self.stack_min.pop()
    
        def top(self) -> int:
            if self.stack_data:
                return self.stack_data[-1]
    
        def getMin(self) -> int:
            if self.stack_min:
                return self.stack_min[-1]
    

    复杂度分析

    方案一

    • 时间复杂度:O(1),“出栈”、“入栈”、“查看栈顶元素”的操作和数据量的多少无关,都是有限的步骤
    • 空间复杂度:O(n)
    • 方案一压入时稍省空间,弹出稍费时间

    方案二

    • 时间复杂度:O(1),“出栈”、“入栈”、“查看栈顶元素”的操作和数据量的多少无关,都是有限的步骤
    • 空间复杂度:O(n)
    • 方案二压入时稍费空间,弹出稍省时间

    公众号:《程序员养成记》 

    主要写算法、计算机基础之类的文章, 有兴趣来关注一起成长!

    版权声明 :著作权归作者所有,非商业转载请注明出处,禁止商业转载。

  • 相关阅读:
    我爱Java系列之---【SpringBoot打成war包部署】
    279. Perfect Squares
    矩阵dfs--走回路
    112. Path Sum
    542. 01 Matrix
    106. Construct Binary Tree from Inorder and Postorder Traversal
    105. Construct Binary Tree from Preorder and Inorder Traversal
    Invert Binary Tree
    563 Binary Tree Tilt
    145 Binary Tree Postorder Traversal
  • 原文地址:https://www.cnblogs.com/magicroc/p/11876440.html
Copyright © 2011-2022 走看看