LeetCode精選TOP面試題122.買賣股票的最佳時機II

題目描述

給定一個數組,它的第 i 個元素是一支給定股票第 i 天的價格。
設計一個算法來計算你所能獲取的最大利潤。你可以儘可能地完成更多的交易(多次買賣一支股票)。
不能同時參與多筆交易(必須在再次購買前出售掉之前的股票)。
示例 1:

輸入: [7,1,5,3,6,4]
輸出: 7
解釋: 在第 2 天(股票價格 = 1)的時候買入,在第 3 天(股票價格 = 5)的時候賣出, 這筆交易所能獲得利潤 = 5-1 = 4 。
     隨後,在第 4 天(股票價格 = 3)的時候買入,在第 5 天(股票價格 = 6)的時候賣出, 這筆交易所能獲得利潤 = 6-3 = 3 。
示例 2:
輸入: [1,2,3,4,5]
輸出: 4
解釋: 在第 1 天(股票價格 = 1)的時候買入,在第 5 天 (股票價格 = 5)的時候賣出, 這筆交易所能獲得利潤 = 5-1 = 4 。
     注意你不能在第 1 天和第 2 天接連購買股票,之後再將它們賣出。
     因爲這樣屬於同時參與了多筆交易,你必須在再次購買前出售掉之前的股票。
示例 3:

輸入: [7,6,4,3,1]
輸出: 0
解釋: 在這種情況下, 沒有交易完成, 所以最大利潤爲 0。

解題思路

  • 思路1 :一步一計算
    定義入手價格變量 in ,遍歷數組,判斷當前元素item與in的大小關係,如果item > in, 那麼直接賣出,利潤累加;如果item < in, 更新in爲item,表示可以用比之前更低的價格買入。
    考慮以下兩種情況:
    股票一路走低,那就直接不用買了,只更新in,但是利潤不要累加;
    股票一路走高,那就每次都第二天先賣出賺利潤後再買入,利潤不斷累加,符合題意,並可以引出思路2
  • 思路2:只計算上升曲線,
    啥意思呢?
    就是隻考慮思路1的第二步,當今天的股價比前一天高,就把差價累加到利潤中,很明顯,當股票走低轉折的時候,作爲買家我是不會在前一天購買的,這其實並不合理,因爲股價很難預測,但是題目要求是根據給定數組推算利潤,所以這是可行的。

代碼實現(Java)

/**
 * @author : flower48237
 * @2020/3/16 17:23
 * title : LeetCode精選TOP面試題122.買賣股票的最佳時機II
 */
public class Solution {
    public int maxProfit(int[] prices) {
        if (prices.length == 0){
        	// 判斷數組是否爲空
            return 0;
        }
        int interest = 0; // 利潤初始化爲0
        // 法1
        int in = prices[0];
        for (int i = 1; i < prices.length; i++){
            if (prices[i] > in){
            	// 那麼直接賣出,利潤累加
                interest += prices[i] - in;
                // 更新入手價in
                in = prices[i];
            }else if (prices[i] < in){
            	// 更新入手價in
                in = prices[i];
            }
        }
        
        // 法 2
        for (int i = 1; i < prices.length; i++){
            if (prices[i] > prices[i - 1]){
            	// 只計算上升曲線,差價累加
            	// 很容易考慮如果在曲線圖內,連續的差值實際上就等於
            	// 波峯-波谷 = 極高價賣出 - 極低價買入
                interest += prices[i] - prices[i - 1];
            }
        }
        return interest;
    }
}

其實就是貪心算法的思路

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章