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

194 阅读2分钟

问题描述

小C是一名股票交易员,最近他关注某只股票的价格波动。给定该股票连续N天的价格列表 stockPrices,你需要为小C生成一个新列表,每个位置的值表示从那天起至少需要等待多少天才能看到价格上涨。如果没有上涨的情况,则对应位置的值为0。

例如,对于股票价格列表 [33, 34, 14, 12, 16],从第一天价格 33 开始,价格上涨发生在第二天价格 34,所以输出 1。若某天之后不再有价格上涨,则输出 0。


测试样例

样例1:

输入:N = 5, stockPrices = [33, 34, 14, 12, 16]
输出:[1, 0, 2, 1, 0]

样例2:

输入:N = 6, stockPrices = [45, 44, 46, 43, 42, 48]
输出:[2, 1, 3, 2, 1, 0]

样例3:

输入:N = 3, stockPrices = [10, 9, 8]
输出:[0, 0, 0]

接下来 分析开始!

需要先为小C生成一个新列表,每个位置的值表示从那天起至少需要等待多少天才能看到价格上涨。如果没有上涨的情况,则对应位置的值为0。

数据结构选择

可以使用一个栈来帮助我们解决这个问题。栈可以帮助我们记录当前还未找到上涨价格的索引,从而在找到上涨价格时快速计算等待的天数。

算法步骤

  1. 初始化结果数组:创建一个与 stockPrices 长度相同的数组 result,用于存储每个位置的等待天数。

  2. 使用栈:创建一个栈 stack,用于存储还未找到上涨价格的索引。

  3. 遍历价格列表

    • 如果栈不为空且当前价格大于栈顶索引对应的价格,说明找到了上涨价格,计算等待天数并更新 result
    • 否则,将当前索引入栈。
  4. 处理剩余栈中的元素:栈中剩余的元素表示这些天之后没有价格上涨,直接将 result 对应位置设为0。

理论成立 实现开始!

 public static int[] solution(int N, int[] stockPrices) {
        int[] result = new int[N];
        Stack<Integer> stack = new Stack<>();
        // 遍历价格列表
        for (int i = 0; i < N; i++) {
            // 当栈不为空且当前价格大于栈顶索引对应的价格时
            while (!stack.isEmpty() && stockPrices[i] > stockPrices[stack.peek()]) {
                int prevIndex = stack.pop();
                result[prevIndex] = i - prevIndex; // 计算等待天数
            }
            stack.push(i); // 将当前索引入栈
        }
        // 处理剩余栈中的元素
        while (!stack.isEmpty()) {
            result[stack.pop()] = 0;
        }
        
        return result;
    }