问题描述
小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]
问题分析
这道题目类似于“下一个更大元素”问题,同样可以使用栈来解决,栈可以帮助我们找到每一个价格之后的第一个比他高的价格。当栈顶元素对应价格小于当前价格,即找到了栈顶元素价格上涨的情况,就弹出栈顶元素并计算当前价格与栈顶元素价格对应的下标距离,存储在res中。然后将当前价格下标压入栈中。需要注意的是栈中存储的是价格的下标而非价格,这样做的目的是为了便于计算“上涨天数”,也就是下标之前的差。当遍历完价格列表后,栈中可能还有剩余的元素,这些元素表示这些天之后没有价格上涨的情况,因此需要将这些元素对应的res值设为0。
下一个更大元素
问题描述:给定一个数组nums,你需要找到数组中每个元素的“下一个更大的元素”。下一个更大的元素是指在当前元素右侧的第一个比它大的元素。如果不存在这样的元素,则返回-1。
function solution(N, stockPrices) {
let res = Array(N).fill(0);
let stack = [];
for (let i = 0; i < N; i++) {
while (stack.length > 0 && stockPrices[stack[stack.length - 1]] < stockPrices[i]) {
let prevIndex = stack.pop();
res[prevIndex] = i - prevIndex;
}
stack.push(i);
}
// 处理剩余元素
while (stack.length > 0) {
let prevIndex = stack.pop();
res[prevIndex] = 0;
}
return res;
}
最后还是利用豆包MarsCode将JavaScript代码转成python代码并提交
def solution(N, stockPrices):
res = [0] * N # 初始化结果数组,长度为 N,初始值为 0
stack = [] # 初始化空栈,用于存储价格的下标
for i in range(N):
while stack and stockPrices[stack[-1]] < stockPrices[i]:
prev_index = stack.pop()
res[prev_index] = i - prev_index
stack.append(i)
# 处理剩余元素
while stack:
prev_index = stack.pop()
res[prev_index] = 0
return res