设计一个有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_minapp

方案一

新元素x入栈设计

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

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

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

元素出栈class

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)
  • 方案二压入时稍费空间,弹出稍省时间

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

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

相关文章
相关标签/搜索