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     }

 

posted @ 2016-06-15 06:16  warmland  阅读(196)  评论(0编辑  收藏  举报