901. 股票价格跨度(单调栈)

189 阅读1分钟

image.jpeg

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第28天,点击查看活动详情

测试岗位也越来卷了,除了基本的功能测试外,还要有编程基础、脚本经验才脱颖而出。

怎么才能提高我们的编程能力呢,刷LeetCode是最佳的途径之一,话不多数,刷题走起~

一、题目描述:

  • 题目内容

    image.png

  • 题目示例

    image.png

  • 题目提示

    • 调用 StockSpanner.next(int price) 时,将有 1 <= price <= 10^5。
    • 每个测试用例最多可以调用  10000 次 StockSpanner.next。
    • 在所有测试用例中,最多调用 150000 次 StockSpanner.next。
    • 此问题的总时间限制减少了 50%。

二、思路分析:

我们今天拿到本题是 leetcode 难度为中等题 901. 股票价格跨度。题目要求对当天股价的跨度进行计算,历史股价小于等于今天的股价的最大连续天数,翻译成人话就是从当天算起,往回数小于等于自己的次数,直到遇到大于自己数为止。

  • piece值范围在[1,10^5]
  • 调用next次数10000次,每调用一次,从头遍历数组到后面会超时

根据题目示例,我们可以使用单调栈的方法来解答本题,思路如下:

  • 方法一:单调栈

    • 根据题目示例,发现股价趋势是单调递减的,使用数组来模拟单调栈
    • 首先StockSpanner()类初始化时创建一个单调栈数组stocklist来存储单调递减的(price,day)
    • 当单调栈为空时,则将新输入的price进行入栈操作,连续天数day赋值为1
    • 当单调栈顶的price值大于新输入的price值时,则将输入的price值和day进行入栈操作
    • 当单调栈顶的price值小于等于新输入的price值时,则将栈顶元素推出,并将栈顶元素day值与新输入的price的day进行相加,直到栈顶元素price大于新输入piece退出循环。同时将新输入的piece和day值进行入栈,返回最新的day值 image.png
      class StockSpanner(object):
          def __init__(self):
              self.stocklist = [(0,0)]
          def next(self, price):
              """
              :type price: int
              :rtype: int
              """
              day = 1
              while self.stocklist and price >= self.stocklist[-1][0]:
                  day += self.stocklist.pop()[1]
              self.stocklist.append((price,day))
              return day
      

三、总结:

本题是一道关于单调栈的应用,根据题目示例发现栈中的数据是单调递减的,因此每一次遍历时把不符合小于当前的数推出栈,让栈的元素始终保持单调递减状态。 AC 提交记录如下:

image.png

  • 时间复杂度:O(n),n为调用next()方法次数
  • 空间复杂度:O(n),n为单调栈的元素

以上是本期内容,欢迎大佬们点赞评论,下期见~~~