1 <= prices.length <= 10^5
0 <= prices[i] <= 10^4
二、解题思路
为了找到最大利润,我们需要找到买入和卖出股票的最佳时机。这个问题可以通过一次遍历数组来解决。我们可以在遍历过程中记录到目前为止遇到的最小价格,并且对于每一天,计算如果在这一天卖出股票能获得的最大利润。这样,我们就不需要考虑买入和卖出的具体时间点,只需要在遍历过程中不断更新最大利润即可。
具体步骤如下:
1. 初始化两个变量,minPrice
设为第一天股票的价格,maxProfit
设为0。
2. 遍历数组prices
,对于每一天:
- 计算如果在这一天卖出股票能获得的利润,即
prices[i] - minPrice
。 - 如果这个利润大于
maxProfit
,则更新maxProfit
。 - 如果当前的股票价格
prices[i]
小于minPrice
,则更新minPrice
为prices[i]
。
3. 遍历完成后,maxProfit
就是能够获得的最大利润。
三、具体代码
class Solution {
public int maxProfit(int[] prices) {
int minPrice = Integer.MAX_VALUE;
int maxProfit = 0;
for (int price : prices) {
if (price < minPrice) {
minPrice = price;
} else if (price - minPrice > maxProfit) {
maxProfit = price - minPrice;
}
}
return maxProfit;
}
}
四、时间复杂度和空间复杂度
1. 时间复杂度
- 代码中有一个循环,该循环遍历一次给定数组
prices
。 - 在循环内部,每次迭代只进行常数时间的操作,包括比较和赋值。
- 因此,循环的时间复杂度是O(n),其中n是数组
prices
的长度。
2. 空间复杂度
- 代码中使用了一个固定大小的变量
minPrice
来存储最小价格,以及一个固定大小的变量maxProfit
来存储最大利润。 - 这些变量使用的空间不随输入数组的大小而变化。
- 因此,空间复杂度是O(1),即常数空间复杂度。
综上所述,代码的时间复杂度是O(n),空间复杂度是O(1)。