持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第28天,点击查看活动详情
测试岗位也越来卷了,除了基本的功能测试外,还要有编程基础、脚本经验才脱颖而出。
怎么才能提高我们的编程能力呢,刷LeetCode是最佳的途径之一,话不多数,刷题走起~
一、题目描述:
-
题目内容
-
题目示例
-
题目提示
- 调用 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值
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 提交记录如下:
- 时间复杂度:O(n),n为调用next()方法次数
- 空间复杂度:O(n),n为单调栈的元素
以上是本期内容,欢迎大佬们点赞评论,下期见~~~