题目:
给定一个数组 prices
,它的第 i 个元素 prices[i]
表示一支给定股票第 i 天的价格。
你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子卖出该股票。设计一个算法来计算你所能获取的最大利润。
返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回0。
思路:
- 本题最容易想到的就是暴力解法,两次循环遍历数组,求最大值。此方法
时间复杂度为O(n²)
,我们需要将他进行改进 - 我们可以在遍历的时候定义一个当前历史最小值
minPrice
,试想一下生活中我们肯定希望在股价最低点买入,这样利润才会最大。也就是求最大差值maxProfit
- 如果
prices[i] < minPrice
,说明股价还能更低,那么就更新历史最小值。否则如果prices[i] - minPrice > maxProfit
,说明当前最大利润(也就是最大差值)还能更大,将maxProfit
进行更新,这样一次循环我们就可以确定最大利润值
以下为代码+注释:
public int maxProfit(int[] prices) {
// 记录一个历史最低值,每次拿当前价格和历史最低值求差值
int maxProfit = 0;
int minPrice = Integer.MAX_VALUE;
for(int i = 0; i < prices.length; i++){
// 如果当前值比历史最低值还小,那么更新历史最低值
if(prices[i] < minPrice){
minPrice = prices[i];
// 否则,说明当前价格比历史最低值高,那么就更新利润为当前最大
}else if(prices[i] - minPrice > maxProfit){
maxProfit = prices[i] - minPrice;
}
}
return maxProfit;
}
笔者也在不断学习中,如有错误,欢迎指正!