leetcode155最小栈

leetcode155 Min Stack

Posted by BY on March 25, 2019

前言

新的一年,好好学习。尝试用python写写代码。

正文

问题来源

本问题来自leetcode上的155题。

问题描述

设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。
push(x) – 将元素 x 推入栈中。
pop() – 删除栈顶的元素。
top() – 获取栈顶元素。
getMin() – 检索栈中的最小元素。

示例 1:

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

分析:

用两个栈分别记录所有元素和当前最小元素。对所有元素的栈push,pop与普通栈操作相同;而对最小栈的push操作需要判断push进来的元素小于最小栈的栈顶则加入,pop操作要所有元素的栈顶元素与最小栈的元素相同才进行弹出操作。

class MinStack(object):

    def __init__(self):
        """
        initialize your data structure here.
        """
        self.min_stack = []
        self.total_stack = []

    def push(self, x):
        """
        :type x: int
        :rtype: None
        """
        self.total_stack.append(x)
        if not self.min_stack or (self.min_stack and self.min_stack[-1] >= x):
            self.min_stack.append(x)

    def pop(self):
        """
        :rtype: None
        """
        x = self.total_stack.pop()
        if self.min_stack[-1] == x:
            self.min_stack.pop()
        return x

    def top(self):
        """
        :rtype: int
        """
        return self.total_stack[-1]

    def getMin(self):
        """
        :rtype: int
        """
        return self.min_stack[-1]
        

要注意的是push操作的时候需要最小栈非空,且栈顶元素要大于等于插入元素(不能仅大于)。假设先push 0 1 0,随后pop,然后getMin会导致出现问题。

总结:

勤思考。

结语

不管怎么样好好加油。