博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
(python版)《剑指Offer》JZ20:包含min函数的栈
阅读量:4091 次
发布时间:2019-05-25

本文共 1585 字,大约阅读时间需要 5 分钟。

在这里插入图片描述

【解题思路】

普通栈的 push() 和 pop() 函数的复杂度为 O(1) ;而获取栈最小值 min() 函数需要遍历整个栈,复杂度为 O(N) 。

【本题难点】 将 min() 函数复杂度降为 O(1) ,可通过建立辅助栈实现;

  • 数据栈 A : 栈 A 用于存储所有元素,保证入栈 push() 函数、出栈 pop() 函数、获取栈顶 top() 函数的正常逻辑。
  • 辅助栈 B : 栈 B 中存储栈 A 中所有 非严格降序 的元素,则栈 A 中的最小元素始终对应栈 B 的栈顶元素,即 min() 函数只需返回栈 B 的栈顶元素即可。

因此,只需设法维护好 栈 B 的元素,使其保持非严格降序,即可实现 min() 函数的 O(1) 复杂度

【函数设计】

  • push(x) 函数: 重点为保持栈 B 的元素是 非严格降序 的。

    • 将 x 压入栈 A (即 A.add(x) );
      • ① 栈 B 为空
      • ② x 小于等于 栈 B 的栈顶元素,则将 x 压入栈 B (即 B.add(x) )。
  • pop() 函数: 重点为保持栈 A, B的 元素一致性 。

    • 执行栈 A 出栈(即 A.pop() ),将出栈元素记为 yy ;
    • 若 y 等于栈 B 的栈顶元素,则执行栈 B 出栈(即 B.pop() )。
  • top() 函数: 直接返回栈 A 的栈顶元素即可,即返回 A.peek() 。

  • min() 函数: 直接返回栈 B 的栈顶元素即可,即返回 B.peek() 。

class MinStack(object):    def __init__(self):        """        initialize your data structure here.        """        self.A,self.B = [],[]    def push(self, x):        # 压入栈A, 压入栈B(当B为空 或 x小于栈B的栈顶元素时)        self.A.append(x)        if not self.B or self.B[-1]>=x:            self.B.append(x)    def pop(self):        # A出栈, B出栈(若A弹出的 即为 B的栈顶元素)        if self.A.pop() == self.B[-1]:            self.B.pop()    def top(self):        return self.A[-1]   # 直接返回栈 A 的栈顶元素即可    def min(self):        return self.B[-1]   # 直接返回栈 B 的栈顶元素即可# Your MinStack object will be instantiated and called as such:# obj = MinStack()# obj.push(x)# obj.pop()# param_3 = obj.top()# param_4 = obj.min()'''作者:jyd链接:https://leetcode-cn.com/problems/bao-han-minhan-shu-de-zhan-lcof/solution/mian-shi-ti-30-bao-han-minhan-shu-de-zhan-fu-zhu-z/'''
  • 复杂度分析:
    时间复杂度 O(1) : push(), pop(), top(), min() 四个函数的时间复杂度均为常数级别。
    空间复杂度 O(N): 当共有 N 个待入栈元素时,辅助栈 BB 最差情况下存储 N 个元素,使用 O(N) 额外空间。

转载地址:http://tfjii.baihongyu.com/

你可能感兴趣的文章
乔布斯18岁求职信拍卖价22.24万美元,值吗?
查看>>
为何程序员总喜欢写技术博客,看完恍然大悟...
查看>>
大学辍学、自学编程,GitHub 创始人是怎么号召 2800 万程序员的?
查看>>
为什么我抛弃了 Ubuntu?
查看>>
GitHub 标星 2.7w+!超全大厂面试笔记整理!
查看>>
牛逼!这款神器能在浏览器跑 VS Code,让你随时随地写代码!
查看>>
推荐一位 10w+ 粉丝的 Python 工程师
查看>>
假如计算机是中国人发明的,那代码应该这么写
查看>>
科技公司最爱的 50 款开源工具,你都用过吗?
查看>>
触目惊心:比特币到底消耗了多少能源?
查看>>
面试官:简历上敢写技术精通?那我就不客气了!
查看>>
如何判断一家互联网公司要倒闭了?
查看>>
想快速上手机器学习?来看下这个 GitHub 项目!
查看>>
GitHub 标星 3.6k,一本开源的深度学习中文教程!
查看>>
9 款你不能错过的 JSON 工具
查看>>
就在昨天,全球 42 亿 IPv4 地址宣告耗尽!
查看>>
200页!分享珍藏很久的Python学习知识手册(附链接)
查看>>
程序员之神
查看>>
4 岁小女孩给 Linux 内核贡献提交
查看>>
推荐几个私藏很久的技术公众号给大家
查看>>