在從頭掃描數組的過程中,我們使用兩個變量maxCurr和maxSoFar分別存儲當前的差值和到目前爲止的最大差值,其中
maxCurr = Math.max(0, maxCurr += prices[i] - prices[i - 1]);
這行代碼的意思就是:當目前的prince差值爲正的時候,我們就繼續向後推進,而當prince的差值爲負的時候,我們就把當前的差值設置爲0。同時在每一步中比較maxCurr和maxSoFar的大小,將較大的值賦給maxSoFar:
maxSoFar = Math.max(maxCurr, maxSoFar);
時間複雜度爲O(n),空間複雜度爲O(1),代碼如下:
public class Solution {
public int maxProfit(int[] prices) {
if(prices == null || prices.length == 0) return 0; // corner case
int maxCurr = 0; // current maximum value
int maxSoFar = 0; // maximum value found so far
for(int i = 1; i < prices.length; i++){
maxCurr = Math.max(0, maxCurr += prices[i] - prices[i - 1]);
maxSoFar = Math.max(maxCurr, maxSoFar);
}
return maxSoFar;
}
}
public class Solution{
public int maxProfit(int[] prices){
if(prices == null || prices.length == 0) return 0;
int maxCurr = 0;
int maxSoFar = 0;
for(int i = 1; i < prices.length; i++){
maxCurr = Math.max(0, maxCurr += prices[i] - prices[i - 1]);
maxSoFar = Math.max(maxCurr, maxSoFar);
}
return maxSoFar;
}
}