问题描述
小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。
数据结构选择
可以使用一个栈来帮助我们解决这个问题。栈可以帮助我们记录当前还未找到上涨价格的索引,从而在找到上涨价格时快速计算等待的天数。
算法步骤
-
初始化结果数组:创建一个与
stockPrices长度相同的数组result,用于存储每个位置的等待天数。 -
使用栈:创建一个栈
stack,用于存储还未找到上涨价格的索引。 -
遍历价格列表:
- 如果栈不为空且当前价格大于栈顶索引对应的价格,说明找到了上涨价格,计算等待天数并更新
result。 - 否则,将当前索引入栈。
- 如果栈不为空且当前价格大于栈顶索引对应的价格,说明找到了上涨价格,计算等待天数并更新
-
处理剩余栈中的元素:栈中剩余的元素表示这些天之后没有价格上涨,直接将
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;
}