第484题 股票价格上涨天数计算
题目分析
给定一个股票价格的列表 stockPrices,我们需要为每一天计算出该天之后需要等待多少天才能看到价格上涨。如果没有上涨的情况,则该天的值为 0。
例如:
- 输入:[33, 34, 14, 12, 16]
- 输出:[1, 0, 2, 1, 0]
这是因为从第一天开始,价格 33 到第二天的 34 上涨了,所以下一天就是上涨的天数。对于第二天 34 后面没有上涨,所以输出 0。
解题思路
我们可以用栈(Stack)来优化计算过程。具体步骤如下:
-
反向遍历:我们从最后一天开始,逐步往前推算每一天需要多少天才能看到上涨的价格。
-
栈的作用:
- 栈用于保存价格及其对应的天数。
- 栈的主要功能是快速找到当前价格之后的第一个上涨价格的天数。
- 通过栈,我们可以避免重新检查已经检查过的价格,从而优化计算过程。
-
具体算法:
- 从最后一天开始,我们逐个检查每一天的价格。
- 如果某一天的价格比栈顶的价格小,说明该天之后的价格没有上涨,可以继续检查下一个价格。
- 如果某一天的价格比栈顶的价格大,说明找到了上涨的天数,将该天数作为结果。
-
栈的更新规则:
- 如果栈顶的价格小于当前价格,则栈顶元素出栈,表示该价格之后不会有上涨。
- 将当前天的索引压入栈,等待下一次比较。
解题代码
def solution(N: int, stockPrices: list) -> list:
# 初始化结果列表,默认值为 0
result = [0] * N
# 栈用来存储价格和对应的天数
stack = []
# 从后往前遍历价格列表
for i in range(N-1, -1, -1):
# 移除栈中所有小于等于当前价格的元素
while stack and stockPrices[stack[-1]] <= stockPrices[i]:
stack.pop()
# 如果栈为空,表示没有后续上涨的情况
if stack:
result[i] = stack[-1] - i
# 把当前天的索引压入栈
stack.append(i)
return result
if __name__ == '__main__':
print(solution(5, [33, 34, 14, 12, 16]) == [1, 0, 2, 1, 0])
print(solution(6, [45, 44, 46, 43, 42, 48]) == [2, 1, 3, 2, 1, 0])
print(solution(3, [10, 9, 8]) == [0, 0, 0])
模块解释
-
栈的使用:
- 栈用于存储股票价格上涨天数的索引,通过栈顶的索引可以快速找到某一天之后的价格变化。
-
遍历过程:
- 遍历从最后一天开始,计算每一天的结果。
- 对每一天,首先移除所有小于或等于当前价格的天数索引。
- 如果栈中还有索引,则栈顶的索引表示下一个上涨价格的位置,计算天数差。
-
结果生成:
- 通过栈的操作,我们逐步计算出每一天需要等待多少天才能看到价格上涨。
结论
- 时间复杂度:O(N),其中 N 是股票价格列表的长度。每个价格最多被入栈和出栈一次,所以整个过程的时间复杂度为 O(N)。
- 空间复杂度:O(N),用于存储结果和栈。栈最多会存储 N 个索引。
通过栈的优化,我们避免了重复计算,解决了问题,同时保证了算法的高效性。