Leetcode 155. 最小栈

在这里插入图片描述

心路历程:

这道题的难点在于加入最小值pop出去的话,怎么快速地找到下一个最小值。一个直观的想法是每次在push的时候都用链表把这些值给连上,按照从小到大的顺序。这样可以保证查找最小值的时间是常数,但是不能保证每次push和pop的时间复杂度。

用链表做了一下,主要是顺便复习了一下链表,这道题用链表的做法和LRU缓存那道题非常类似。

最好的做法是再构造一个最小辅助栈。这个栈的规则是:
入栈:辅助栈为空 或者 新加入的元素比辅助栈顶元素还小
出栈:数据栈出栈元素正好是辅助栈的栈顶元素

这样做的本质在于,我们不care ”后来的并且比前面来的值还大的元素

注意的点:

1、链表的虚拟头结点对于链表的插入和删除操作是很有用的,核心概念就是while t.next: if … break else: t = t.next。需要每次访问t.next的元素,因此插入和删除都得依赖所寻求结点的前一个结点
2、链表的插入和删除都是三行:赋值temp + 重新赋值两个next (删除的话重新赋值一个None保证链表安全)

解法一:最小辅助栈

class MinStack(object):
    def __init__(self):
        self.s1 = [] 
        self.s2 = []

    def push(self, x):
        if not self.s2 or x <= self.getMin():
            self.s2.append(x) 
        self.s1.append(x)

    def pop(self):
        if self.s1[-1] == self.getMin():
            self.s2.pop()
        self.s1.pop()

    def top(self):
        return self.s1[-1]

    def getMin(self):
        return self.s2[-1]

解法二:链表+栈

class MinStack:

    def __init__(self):
        from collections import deque
        self.stack = deque([])
        self.minlink = Node()

    def push(self, val: int) -> None:
        self.stack.append(val)
        newnode = Node(val)
        t = self.minlink
        while t.next:
            if t.next.val >= val:
                break
            t = t.next
        # 此时插入到t后面的元素
        temp = t.next
        t.next = newnode
        newnode.next = temp

    def pop(self) -> None:
        val = self.stack.pop()
        # 删除链表中的元素val
        t = self.minlink
        while t.next:
            if t.next.val == val:
                break
            t = t.next
        assert t.next.val == val
        temp = t.next.next
        t.next.next = None
        t.next = temp
        return val

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

    def getMin(self) -> int:
        return self.minlink.next.val

class Node:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next

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

相关推荐

  1. LeetCode 155

    2024-04-07 06:48:03       29 阅读
  2. Leetcode 155. 【中等】

    2024-04-07 06:48:03       12 阅读
  3. LeetCode_Hot100__155_Python

    2024-04-07 06:48:03       21 阅读
  4. LeetCode热题100】155.

    2024-04-07 06:48:03       16 阅读
  5. 155.

    2024-04-07 06:48:03       37 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-07 06:48:03       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-07 06:48:03       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-07 06:48:03       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-07 06:48:03       18 阅读

热门阅读

  1. [高考] 数理化

    2024-04-07 06:48:03       12 阅读
  2. centos 安装 stable-diffusion 详细流程

    2024-04-07 06:48:03       11 阅读
  3. QT智能指针

    2024-04-07 06:48:03       18 阅读
  4. 【工具或平台】Gem5编译

    2024-04-07 06:48:03       13 阅读
  5. vue指令v-model

    2024-04-07 06:48:03       14 阅读
  6. Transformer架构的自注意力机制

    2024-04-07 06:48:03       13 阅读
  7. Django -- 报错

    2024-04-07 06:48:03       11 阅读
  8. VS CODE环境安装和hello world

    2024-04-07 06:48:03       13 阅读
  9. EmmyLuaDebugger介绍与源代码分析

    2024-04-07 06:48:03       14 阅读
  10. 【Node.js】缓存

    2024-04-07 06:48:03       17 阅读
  11. MyBatis与Hibernate的优缺点对比

    2024-04-07 06:48:03       11 阅读
  12. 虚拟机安装docker容器

    2024-04-07 06:48:03       13 阅读
  13. Node.js 和 npm 命令

    2024-04-07 06:48:03       13 阅读