题意:给定一个数组arr,arr[i]表示第i天的股票价格,只能进行一次交易的情况下,且买入须在卖出股票之前,求最佳时间买入和卖出股票的最大收益。
使用Kadane's Algorithm 算法,该算法是针对最大子序列问题 leetcode53。
使用一个变量maxCur存目前的最大值,maxSoFar存最终的最大值。
maxCur += prices[i] - prices[i-1] 计算原始数组中价格的差异,置0的原因是,当此时prices[i]比上次购买进入的价格更低时,当用此时的价格买入时,为之后的价格重新计算差异,来查找还有没有更好的收益。
代码:
public int maxProfit(int[] prices) {
int maxCur = 0, maxSoFar = 0;
for(int i=1; i<prices.length; i++){
maxCur = Math.max(0, maxCur += prices[i] - prices[i-1]);
maxSoFar = Math.max(maxCur, maxSoFar);
}
return maxSoFar;
}
不过maxCur那一行比较绕,更易理解的代码:
public int maxProfit(int[] prices) {
int min = Integer.MAX_VALUE;
int gain = 0;
for(Integer p : prices){
if(p < min){
min = p;
}
gain = Math.max(gain, p - min);
}
return gain;
}
Math.min(min, p);