问题描述
小C是一名股票交易员,最近他关注某只股票的价格波动。给定该股票连续N天的价格列表
stockPrices,你需要为小C生成一个新列表,每个位置的值表示从那天起至少需要等待多少天才能看到价格上涨。如果没有上涨的情况,则对应位置的值为0。 例如,对于股票价格列表[33, 34, 14, 12, 16],从第一天价格 33 开始,价格上涨发生在第二天价格 34,所以输出 1。若某天之后不再有价格上涨,则输出 0。
思路一
- 最简单的思路是双重遍历,初始化长度为
N,值为0的列表result,首先遍历股票价格列表stockPrices,设索引为i,然后第二重遍历从i+1开始,设索引j,遇到第一个比stockPrices[i]高的价格就记录间隔的天数并退出当前循环。如果没有遇到,那么索引i的值还是0,最后输出result列表
def solution(N: int, stockPrices: list) -> list:
# 初始化长度为N,每个元素值为0的列表
result = [0] * N
# 遍历倒数第二个元素就行,因为最后一个元素没有比它更大的元素了,全部元素遍历也行,就将循环写成for i in range(N)
for i in range(N-1):
# 从索引i的下一个元素开始遍历
for j in range(i+1, N):
# 找到比索引i更大的元素值
if stockPrices[j] > stockPrices[i]:
# result保存内容
result[i] = j - i
break
return result
复杂度
- 时间复杂度: O()
- 空间复杂度: O()
思路二
- 构建一个从栈顶到栈底单调递增的单调栈,栈中保存列表的索引,遍历股票每天价格的过程中,如果栈顶元素在
stockPrices对应的股票价格小于第i天股票的价格stockPrices[i],那么找到了栈顶元素股票价格的下一个更大值,保存天数间隔,直到遍历整个股票价格列表。 - 拿
stockPrices = [33, 34, 14, 12, 16],result = [0, 0, 0, 0, 0],stack = []举例子 - 第一个元素
33,由于栈为空,所以退出while循环,将索引i存入栈中,此时result = [0, 0, 0, 0, 0],stack = [0] - 第二个元素
34,栈不为空并且栈顶元素0对应的股票价格33小于34,此时将result[0]的值修改成1 - 0,表示33下一个更大的元素值过了1天,并将栈顶元素弹出,保持栈顶到栈底单调递增栈的特点,退出while循环将索引1压入栈中,此时result = [1, 0, 0, 0, 0],stack = [1] - 第三个元素
14,栈不为空,但栈顶元素对应的股票价格34不小于14,因此直接退出while循环,将索引2压入栈中,此时result = [1, 0, 0, 0, 0],stack = [1,2] - 第四个元素
12,栈不为空,但栈顶元素对应的股票价格14不小于12,因此直接退出while循环,将索引3压入栈中,此时result = [1, 0, 0, 0, 0],stack = [1,2,3] - 第五个元素
16,栈不为空并且栈顶元素对应的股票价格12小于16,此时将result[3]的值修改成4-3,表示12下一个更大的元素值过了1天,并将栈顶元素弹出,保持栈顶到栈底单调递增栈的特点,此时result = [1, 0, 0, 1, 0],stack = [1, 2]。此时依然符合while循环条件,栈顶不为空并且栈顶元素对应的股票价格14小于16,此时将result[2]的值修改成4-2,表示14下一个更大的元素值过了2天,将栈顶元素弹出,退出while循环,将索引4压入栈中,退出for循环,此时result = [1, 0, 2, 1, 0],stack = [1, 4],栈不为空说明索引1和索引4对应的股票价格后面没有更高的价格了,列表result的索引1和索引4的值均为0 - 返回结果
result
def solution(N: int, stockPrices: list) -> list:
# 初始化长度为N,每个元素值为0的列表
result = [0] * N
# 从栈顶到栈底单调递增的单调栈
stack = []
# 遍历所有天数的股票价格
for i in range(N):
# 如果栈不为空并且栈顶元素对应的股票价格小于索引i对应的股票价格,那么栈顶元素对应的股票价格找到下一个更大值
while stack and stockPrices[stack[-1]] < stockPrices[i]:
# 记录栈顶元素对应的股票价格在多少天后价格上涨
result[stack[-1]] = i - stack[-1]
# 弹出栈顶元素
stack.pop()
# 将索引i压入栈中
stack.append(i)
return result
复杂度
- 时间复杂度: O()
- 空间复杂度: O()