484. 股票价格上涨天数计算 | 豆包MarsCode AI 刷题

35 阅读4分钟

问题描述

小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(n2n^2)
  • 空间复杂度: O(nn)

思路二

  • 构建一个从栈顶到栈底单调递增的单调栈,栈中保存列表的索引,遍历股票每天价格的过程中,如果栈顶元素在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(nn)
  • 空间复杂度: O(nn)

相似题目