码迷,mamicode.com
首页 > 其他好文 > 详细

Best Time to Buy and Sell Stock II

时间:2014-11-08 22:04:10      阅读:208      评论:0      收藏:0      [点我收藏+]

标签:style   blog   io   color   sp   for   div   on   log   

这道题目比上一个稍微复杂点,答题思路是要分析价格的走势,找出每一阶段的波谷和波峰,求出每一阶段的利润,然后累加得出总利润。

 

需要预读下一个数字,判断价格的走向,如果之前在下降,现在上升了,则得到了波谷,如果之前上升,现在下降了,则得到了波峰,每次得到波峰就要累加一次利润,特别指出的是,有可能直到末尾之一都在上升,所以没法用“转折”法判断波峰,那么就要添加对结尾的判断,如果结尾了并且还是在上升,那么结尾的数字就按照波峰来计算。

 

第一次通过的代码是这样的:

 1 public class Solution {
 2     public int maxProfit(int[] prices) {
 3         
 4         if(prices.length==0||prices.length==1){
 5             return 0;
 6         }
 7         
 8         int profit = 0;
 9         boolean isup = prices[1] > prices[0];
10         int down = isup ? prices[0] : 0;// 记录低谷
11 
12             for (int i = 0; i < prices.length - 1; i++) {
13             if (prices[i] < prices[i + 1]) {
14                 // 在上升
15                 if (isup || i == prices.length - 2) {
16                     // 如果这是一个上升过程中的一部分,但此时已经到达末尾,则最后一次计算profit,否则继续
17                     if (isup == false) {
18                         down = prices[i];
19                     }
20                     if (i == prices.length - 2) {
21                         profit = profit + prices[i + 1] - down;
22                     }
23                 } else {
24                     // 如果这是一次从下降到上升的转折,则prices[i]是新的低谷,更新down数值,将isup设为true
25                     down = prices[i];
26                     isup = true;
27                 }
28             } else {
29                 // 在下降
30                 if (isup) {
31                     // 如果这是上升过程中遇到的下降,则表明这是一个下降拐点,需要计算利润并累加
32                     profit = profit + prices[i] - down;
33                     isup = false;
34                 }
35             }
36         }
37         
38         return profit;
39         
40     }
41 }

注意第16行代码那块很乱,经过整理,稍作修改,新的代码减少了4行代码,时间从488ms降低到460ms,得到的新代码如下:

 1 public class Solution {
 2     public int maxProfit(int[] prices) {
 3         if ((prices.length == 0) || (prices.length == 1)) {
 4             return 0;
 5         }
 6 
 7         int profit = 0;
 8         boolean isup = prices[1] > prices[0];
 9         int down = isup ? prices[0] : 0; // 记录低谷
10 
11         for (int i = 0; i < (prices.length - 1); i++) {
12             if (prices[i] < prices[i + 1]) {
13                 // 在上升
14                 if (!isup) {
15                     // 如果这是一次从下降到上升的转折,则prices[i]是新的低谷,更新down数值,将isup设为true
16                     down = prices[i];
17                     isup = true;
18                 }
19 
20                 if (i == (prices.length - 2)) {
21                     // 如果是到达末尾了,则累加利润
22                     profit = (profit + prices[i + 1]) - down;
23                 }
24             } else {
25                 // 在下降
26                 if (isup) {
27                     // 如果这是上升过程中遇到的下降,则表明这是一个下降拐点,需要计算利润并累加
28                     profit = (profit + prices[i]) - down;
29                     isup = false;
30                 }
31             }
32         }
33 
34         return profit;
35     }
36 }

 

Best Time to Buy and Sell Stock II

标签:style   blog   io   color   sp   for   div   on   log   

原文地址:http://www.cnblogs.com/bluedreamviwer/p/4084024.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!