Best Time to Buy and Sell Stock II leetcode java

愛做飯的小瑩子發表於2014-07-30

題目:

Say you have an array for which the ith element is the price of a given stock on day i.

Design an algorithm to find the maximum profit. You may complete as many transactions as you like (ie, buy one and sell one share of the stock multiple times). However, you may not engage in multiple transactions at the same time (ie, you must sell the stock before you buy again).

 

題解:

簡單的方法就是一旦第二天的價格比前一天的高,就在前一天買入第二天賣出。程式碼如下:

 1 public int maxProfit(int[] prices) {
 2     int total = 0;
 3     for (int i=1; i< prices.length; i++) {
 4         if (prices[i]>prices[i-1]){ 
 5             int profit = prices[i]-prices[i-1];
 6             total += profit;
 7         }
 8     }
 9     return total;
10     }

 但是這個會違反“不能同一天買賣的規則”,例如3天的價格分別為1,2,3,那麼按上述演算法就會在2那天同一天買賣了。。。

 正確的做法是: 第1天買第3天賣。

 雖然兩種方法數字結果是對的,但是邏輯不一樣。。

 不過雖然這麼說,這道題的本事仍然是讓你找最大利潤,並沒有讓你明確哪天買哪天賣。

 所以對面試官你仍然可以說,這種方法只是幫助我找到最大利潤,我並沒有說是要在同一天買賣,只是計算:所有第二天比前一天大的差值的合,我是為了找最大利潤而已(畫個趨勢圖講解一下就行了。。)。

 

不過如果不是那樣略有點投機取巧的話,幹嘛非要每一次有一點點增長就加總和,帶來不必要的解釋麻煩?

何不先找到遞減的區域性最低點,再找到遞增的區域性最高點,算一次加和,然後再這麼找? 這樣就能保證買賣不會在同一天了。。

程式碼如下:

 1    public static int maxProfit(int[] prices) {
 2         int len = prices.length;
 3         if(len <= 1)
 4             return 0;
 5         
 6         int i = 0;
 7         int total = 0;
 8         while(i < len - 1){
 9             int buy,sell;
10             //尋找遞減區間的最後一個值(區域性最小點)
11             while(i+1 < len && prices[i+1] < prices[i])
12                 i++;
13             //區域性最小點作為買入點
14             buy = i;
15             
16             //找下一個點(賣出點至少為下一個點)
17             i++;
18             //不滿足。。繼續往下找遞增區間的最後一個值(區域性最高點)
19             while(i<len && prices[i] >= prices[i-1])
20                 i++;
21             //設定賣出點
22             sell = i-1;
23             //計算總和
24             total += prices[sell] - prices[buy];
25         }
26         return total;
27     }

 感謝JustdoIT(http://www.cnblogs.com/TenosDoIt/p/3436457.html)的方法,要不然網上都是瀰漫著第一個不太好說明白的,但是看起來簡潔的方法。。這個方法更令人信服。

相關文章