这段代码的目的是解决"买卖股票的最佳时机"这个问题,即在给定的股票价格数组中,找到一次买入和卖出所能获得的最大利润。
算法思想:
-
定义两个变量:
minPrice
: 这个变量用于记录迄今为止遇到的最小股票价格(买入价格)。初始值设置为Integer.MAX_VALUE
,这样一开始任何遇到的股票价格都会更新这个值。maxProfit
: 这个变量用于记录当前所能获得的最大利润,初始值为 0。
-
遍历股票价格数组:
- 对于数组中的每个元素(即每天的股票价格),程序检查当前的股票价格是否比之前遇到的最小价格还要低。如果是这样,就更新
minPrice
为当前价格,这相当于记录在这一天买入股票。 - 如果当前的价格比之前的最小价格高,那么计算当前卖出所能获得的利润(即当前价格减去
minPrice
),并与之前记录的maxProfit
比较。如果当前利润更大,就更新maxProfit
。
- 对于数组中的每个元素(即每天的股票价格),程序检查当前的股票价格是否比之前遇到的最小价格还要低。如果是这样,就更新
-
返回结果:
- 当循环遍历完所有价格后,
maxProfit
就会存储整个过程中最大的利润值。最终返回这个值。
- 当循环遍历完所有价格后,
关键点:
- 这个算法的核心在于动态更新股票的最低买入价,同时计算每一天卖出时的最大可能利润。算法每次只遍历一次数组,时间复杂度为 (O(n)),非常高效。
例子分析:
假设输入的 prices
数组为 [7, 1, 5, 3, 6, 4]
,算法的执行过程如下:
- 第1天(价格7):更新
minPrice = 7
。 - 第2天(价格1):更新
minPrice = 1
(遇到更低的价格)。 - 第3天(价格5):计算利润
5 - 1 = 4
,更新maxProfit = 4
。 - 第4天(价格3):利润为
3 - 1 = 2
,maxProfit
保持为4。 - 第5天(价格6):利润为
6 - 1 = 5
,更新maxProfit = 5
。 - 第6天(价格4):利润为
4 - 1 = 3
,maxProfit
保持为5。
最终输出的最大利润为 5
。
这段代码的效率很高,适合处理较大的股票价格数组。
java 实现代码:
java
class Solution {
public int maxProfit(int[] prices) {
int minPrice = Integer.MAX_VALUE, maxPro = 0;
for(int i = 0; i < prices.length; ++i) {
if(prices[i] < minPrice) {
minPrice = prices[i];
}
maxPro = Math.max(maxPro, prices[i] - minPrice);
}
return maxPro;
}
}