问题描述
小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,用于存储每个位置的等待天数。 - 遍历每个价格:使用一个外层循环遍历
stockPrices数组中的每个价格。 - 查找价格上涨:对于每个价格,使用一个内层循环从当前价格的下一天开始,查找是否有价格上涨。
- 记录等待天数:如果在内层循环中找到价格上涨,记录等待天数并跳出内层循环。如果没有找到价格上涨,等待天数保持为0。
- 存储结果:将等待天数存入结果数组
result的对应位置。 - 返回结果:返回结果数组
result。
public class Main {
public static int[] solution(int N, int[] stockPrices) {
// write code here
int[] result = new int[N];
// 遍历每个价格
for (int i = 0; i < N; i++) {
// 初始化等待天数为0
int days = 0;
// 从当前价格的下一天开始,查找是否有价格上涨
for (int j = i + 1; j < N; j++) {
// 如果找到价格上涨,记录等待天数并跳出循环
if (stockPrices[j] > stockPrices[i]) {
days = j - i;
break;
}
}
// 将等待天数存入结果数组
result[i] = days;
}
return result;
}
public static void main(String[] args) {
System.out.println(java.util.Arrays.equals(solution(5, new int[]{33, 34, 14, 12, 16}), new int[]{1, 0, 2, 1, 0}));
System.out.println(java.util.Arrays.equals(solution(6, new int[]{45, 44, 46, 43, 42, 48}), new int[]{2, 1, 3, 2, 1, 0}));
System.out.println(java.util.Arrays.equals(solution(3, new int[]{10, 9, 8}), new int[]{0, 0, 0}));
}
}
复杂度分析
- 时间复杂度:O(N^2),因为我们需要使用双重循环来遍历每个价格并查找价格上涨。
- 空间复杂度:O(N),因为我们使用了一个额外的数组
result来存储等待天数。