给出若干天的股价,如果只有一次买入和卖出的机会,求最大利润
如果六天的股价为[7, 1, 5, 3, 6, 4]
,那么最大利润为6 - 1 = 5
暴力解法
双重循环,这个不用讲了,但是超时了
找最小值
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天买入,那么假设在未来的第j天卖掉可以获得最大值,那么如果在i到j天里我们找到一个时间k,且prices[k] < prices[i]
,那么最大利润将在k天买入,j天卖出达到。因此当遍历一遍数组时就可以得到最大利润
动态规划
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]
表示了每两天股票的差价,将问题转换为求连续子串的最大值,maxCur表示当前天数下的最大收益,maxSoFar表示总天数下的最大收益。 difference可能是个负数,但是只要maxCur大于0,那么表示在第i天卖出时还是赚钱的,如果求得的一个maxCur大于maxSoFar,更新maxSoFar的值
网友评论