算法题 | 豆包MarsCode AI刷题

217 阅读3分钟

1.股票价格上涨天数计算

123a351d9c76df5ab59a3b7e9c48ed72.png

这个问题可以通过使用栈(stack)来解决。栈是一种后进先出(LIFO)的数据结构,非常适合用来处理这类问题。下面是解决这个问题的步骤:

  1. 初始化结果列表:创建一个长度为N的结果列表,初始值全部为0。这个列表将用于存储从每一天开始至少需要等待多少天才能看到价格上涨。

  2. 初始化栈:创建一个空栈。这个栈将用于存储价格列表中元素的下标。

  3. 遍历价格列表:从第一天开始,逐天检查价格。

  4. 比较栈顶元素和当前价格

    如果栈不为空,并且栈顶元素对应的价格小于当前价格,说明当前价格比之前的价格高,可以进行计算。

    计算方法是从当前天减去栈顶元素的下标,得到的就是从栈顶元素对应的那天开始,至少需要等待多少天才能看到价格上涨。

    更新结果列表中栈顶元素下标对应的值为计算出的天数。

    弹出栈顶元素。

  5. 将当前价格的下标压入栈中:无论当前价格是否导致价格上涨,都将当前价格的下标压入栈中。

  6. 返回结果列表:遍历完所有价格后,返回结果列表。

代码如下:

   def solution(N: int, stockPrices: list) -> list:
        # 初始化结果列表
        result = [0] * N
        # 初始化栈
        stack = []


        for i in range(N):
            # 当栈不为空且栈顶元素对应的价格小于当前价格
            while stack and stockPrices[stack[-1]] < stockPrices[i]:
                # 弹出栈顶元素
                prev_index = stack.pop()
                # 更新结果列表
                result[prev_index] = i - prev_index

            # 将当前价格的下标压入栈中
            stack.append(i)
        return result
        

栈(Stack)是一种常用的数据结构,它遵循后进先出(Last In First Out, LIFO)的原则。想象一下一个实际的栈,比如一叠盘子:你只能从栈的顶部添加或移除盘子。最后一个放在上面的盘子(最近加入的)是第一个被移除的。

栈在许多算法中都有应用,比如表达式求值、回溯算法、函数调用管理等。例如,在函数调用中,每次调用一个函数时,它的信息(如返回地址、局部变量等)会被压入调用栈中。当函数返回时,这些信息会被弹出,这样就可以恢复到调用该函数之前的上下文。

回到股票价格的问题,栈被用来跟踪价格列表中元素的下标。当遇到一个比栈顶元素对应的价格更高的价格时,说明从栈顶元素对应的那天开始,至少需要等待的天数就是当前天减去栈顶元素的下标。然后,栈顶元素被弹出,继续比较下一个元素。如果当前价格没有导致价格上涨,则直接将当前价格的下标压入栈中。