leetcode 155.min-stack 最小栈 python3

时间:2020-5-19

题目地址:https://leetcode-cn.com/problems/min-stack/description/

题目难度:Easy

题目描述:

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

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

示例:

输入:
["MinStack","push","push","push","getMin","pop","top","getMin"]
[[],[-2],[0],[-3],[],[],[],[]]

输出:
[null,null,null,null,-3,null,0,-2]

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


思路1:使用队列的复制排序函数,后边才看到要求在常数时间内找到最小元素,我这肯定凉凉

代码段1:通过,但是不符合题意

class MinStack:

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

    def push(self, x: int) -> None:
        self._list.append(x)

    def pop(self) -> None:
        del self._list[-1]

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

    def getMin(self) -> int:
        li = sorted(self._list)
        return li[0]

# Your MinStack object will be instantiated and called as such:
# obj = MinStack()
# obj.push(x)
# obj.pop()
# param_3 = obj.top()
# param_4 = obj.getMin()

总结:

  1. 认真审题很重要

思路2:使用两个栈

一个栈去保存正常的入栈出栈的值,另一个栈去存最小值,也就是用栈顶保存当前所有元素的最小值。

代码段2:通过

class MinStack:

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

    def push(self, x: int) -> None:
        self._list.append(x)
        if not self._min_list or x <= self._min_list[-1]:
            self._min_list.append(x)

    def pop(self) -> None:
        if(self._list[-1] == self._min_list[-1]):
            del self._min_list[-1]
        del self._list[-1]

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

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

# Your MinStack object will be instantiated and called as such:
# obj = MinStack()
# obj.push(x)
# obj.pop()
# param_3 = obj.top()
# param_4 = obj.getMin()

总结:

  1. 时间复杂度:O(1),空间复杂度:O(N)
  2. 解法3:使用一个栈,同时存储最小值入栈;解法4:存储差值解决了「保存之前值」的问题;解法5:降维打击,改写数据结构,加入min属性

 

你可能感兴趣的:(leetcode)