大家好,今天我来分享我的豆包MarsCode AI刷题。这次我将解决的是股票价格上涨天数计算问题,这个问题虽然比较简单,但是有一些细节需要注意,这里我就来分享一下。
问题描述
小C是一名股票交易员,最近他关注某只股票的价格波动。给定该股票连续N天的价格列表 stockPrices,你需要为小C生成一个新列表,每个位置的值表示从那天起至少需要等待多少天才能看到价格上涨。如果没有上涨的情况,则对应位置的值为0。
示例
例如,对于股票价格列表[33, 34, 14, 12, 16],从第一天价格 33 开始,价格上涨发生在第二天价格 34,所以输出 1。若某天之后不再有价格上涨,则输出 0。则可以得到最后的输出为[1, 0, 2, 1, 0]。
解题步骤
这个问题思路是依次判断每一个元素后面是否有比它大的元素,如果有则返回两者索引的差值即可,可能乍一看比较麻烦,需要对每一个元素从头到尾遍历一遍,实际上不需要,可以巧妙利用栈的结构来进行判断。
实现代码
ini
代码解读
复制代码
public static int[] solution(int N, int[] stockPrices) {
// write code here
Stack<Integer> stack1 = new Stack<>();
Stack<Integer> stack2 = new Stack<>();
int []arr = new int[N];
for (int i = 0; i < arr.length; i++) {
arr[i]=0;
}
for (int i = 0; i < stockPrices.length-1; i++) {
stack1.push(i);
stack2.push(stockPrices[i]);
while(stack2.size()!=0 && stockPrices[i+1]>stack2.peek()){
arr[stack1.peek()]=i+1-stack1.peek();
stack1.pop();
stack2.pop();
}
}
return arr;
}
细节注意
这道题我刚开始是想到用一个栈进行判断,栈来存储元素的索引,但后来又出现了一个错误,怀疑是不是用栈来解决不是很正确。但后来反应过来可以定义两个栈,一个栈用来存储元素的索引,一个栈用来存储元素的值,再定义一个和股票价格列表长度相同的全0数组。然后依次遍历股票数组,将索引和值分别入栈,这时要注意比较的是下一个元素和栈顶元素的大小关系,由于需要从当前索引开始比较,所以和栈顶比,然后如果大于当前栈顶元素,则依次出栈,将栈顶元素索引对应的值修改为两者索引的差值。用两个栈的优点就是能在比较每一个元素的同时,还能够修改索引的差值。并且这里还要注意的遍历不用遍历所有的元素,最后一个元素不用遍历,因为最后一个元素必定是0。同时在为数组赋值时,是i+1-stack1.peek(),因为是下一个元素和栈顶元素进行比较,所以要加1.