122. Best Time to Buy and Sell Stock II
1.
ref: http://blog.csdn.net/linhuanmars/article/details/23164149
区别是这里可以交易无限多次(当然我们知道交易不会超过n-1次,也就是每天都进行先卖然后买)。既然交易次数没有限定,可以看出我们只要对于每次两天差价大于0的都进行交易,就可以得到最大利润。因此算法其实就是累加所有大于0的差价既可以了,非常简单。如此只需要一次扫描就可以了,时间复杂度是O(n),空间上只需要O(1)存一个累加结果即可。
1 public int maxProfit(int[] prices) { 2 if(prices.length < 1) { 3 return 0; 4 } 5 int diff = 0; 6 for(int i = 1; i < prices.length; i++) { 7 diff += (prices[i] - prices[i-1] > 0)? prices[i] - prices[i-1]: 0; 8 } 9 return diff; 10 }
2. 动规
维护两个变量:
1. 今天结束,手上没有股票
1)以前没有股票,今天什么都没做
2)以前有股票,今天买了
2. 今天结束,手上有股票
1)以前没有股票,今天买入
2)以前有股票,今天什么都没做
1 public int maxProfit(int[] prices) { 2 if(prices.length < 1) { 3 return 0; 4 } 5 int noStock = 0; 6 int haveStock = 0 - prices[0]; 7 for(int i = 1; i < prices.length; i++) { 8 int oldNoStock = noStock; 9 noStock = Math.max(noStock, haveStock + prices[i]); 10 haveStock = Math.max(haveStock, noStock - prices[i]); 11 } 12 return noStock; 13 }