901. 股票价格跨度(Python)
难度:★★★☆☆
类型:数组
方法:单调栈
题目
力扣链接请移步本题传送门
更多力扣中等题的解决方案请移步力扣中等题目录
编写一个 StockSpanner 类,它收集某些股票的每日报价,并返回该股票当日价格的跨度。
今天股票价格的跨度被定义为股票价格小于或等于今天价格的最大连续日数(从今天开始往回数,包括今天)。
例如,如果未来7天股票的价格是 [100, 80, 60, 70, 60, 75, 85],那么股票跨度将是 [1, 1, 1, 2, 1, 4, 6]。
示例:
输入:["StockSpanner","next","next","next","next","next","next","next"], [[],[100],[80],[60],[70],[60],[75],[85]]
输出:[null,1,1,1,2,1,4,6]
解释:
首先,初始化 S = StockSpanner(),然后:
S.next(100) 被调用并返回 1,
S.next(80) 被调用并返回 1,
S.next(60) 被调用并返回 1,
S.next(70) 被调用并返回 2,
S.next(60) 被调用并返回 1,
S.next(75) 被调用并返回 4,
S.next(85) 被调用并返回 6。
注意 (例如) S.next(75) 返回 4,因为截至今天的最后 4 个价格
(包括今天的价格 75) 小于或等于今天的价格。
提示:
调用 StockSpanner.next(int price) 时,将有 1 <= price <= 10^5。
每个测试用例最多可以调用 10000 次 StockSpanner.next。
在所有测试用例中,最多调用 150000 次 StockSpanner.next。
此问题的总时间限制减少了 50%。
解答
我们用单调栈来解决这个问题。
直接的思路是,我们把各个时刻股票价格入栈,从栈顶向栈底统计不超过当前股票价格的所有时刻价格的数目,以此作为当前股票的跨度返回。但是存在的问题是,这种暴力做法存在大量重复计算,因此很容易超过时间限制。因此,我们需要考虑新的思路。
准备一个栈(也就是代码中的self.stack,可以用列表实现),这里栈中存储的不是每个时刻的股票价格,而仅仅存储到当前时刻为止,单调递减的时刻及其跨度。因此每次计算时,仅仅在满足条件时将可以合并的股票价格对应的跨度相加即可。
class StockSpanner:
def __init__(self):
self.stack = []
def next(self, price):
span = 1
while self.stack and self.stack[-1]["price"] <= price:
span += self.stack.pop()["span"]
self.stack.append({"price": price, "span": span})
return span
如有疑问或建议,欢迎评论区留言~
有关更多力扣中等题的python解决方案,请移步力扣中等题解析