給出若干天的股價,如果只有一次買入和賣出的機會,求最大利潤
如果六天的股價為[7, 1, 5, 3, 6, 4]
,那么最大利潤為6 - 1 = 5
暴力解法
雙重循環(huán),這個不用講了,但是超時了
找最小值
public int maxProfit(int[] prices) {
int max = 0, min = Integer.MAX_VALUE;
for (int i = 0; i < prices.length; i++) {
if (prices[i] < min) {
min = prices[i];
} else {
max = Math.max(max, prices[i] - min);
}
}
return max;
}
這個算法的思路是在第i天買入,那么假設(shè)在未來的第j天賣掉可以獲得最大值,那么如果在i到j(luò)天里我們找到一個時間k,且prices[k] < prices[i]
,那么最大利潤將在k天買入,j天賣出達到。因此當(dāng)遍歷一遍數(shù)組時就可以得到最大利潤
動態(tài)規(guī)劃
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;
}
difference = prices[i] - prices[i-1]
表示了每兩天股票的差價,將問題轉(zhuǎn)換為求連續(xù)子串的最大值,maxCur表示當(dāng)前天數(shù)下的最大收益,maxSoFar表示總天數(shù)下的最大收益。 difference可能是個負數(shù),但是只要maxCur大于0,那么表示在第i天賣出時還是賺錢的,如果求得的一個maxCur大于maxSoFar,更新maxSoFar的值