切換
舊版
前往
大廳
主題

LeetCode - 122. Best Time to Buy and Sell Stock II 解題心得

Not In My Back Yard | 2020-08-23 00:00:06 | 巴幣 0 | 人氣 344

題目連結:


題目意譯:
假設你有一個陣列 prices,其第 i 個元素代表著某個股票第 i 天的價格。

設計一個演算法去找到最大利潤。你可以完成任意數量的交易(即多次地買入以及賣出一股股票)。

注:你不能同時進行多個交易(即再次買入股票前,必須賣掉現有的)。

限制:
1 ≦ prices.length ≦ 3 × 10 ^ 4
0 ≦ prices[i] ≦ 10 ^ 4



範例測資:
範例 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 。


解題思維:
觀察下圖:
可以看到黑色線段 + 棕色線段的長度總和 > 紅色線段長。

因此對於通常情況就是,找出每個價格走勢的山谷以及山峰,將每組山峰的值減去山谷的值加總(例如上面的黑色 + 棕色)會是最大的,而不是盡量找最低的山谷以及最高的山峰(也就是紅線那種)。

而每組山峰 - 山谷的值可以看到,只是將對於每個 i 值滿足 prices[i] > prices[i - 1] 的 prices[i] - prices[i - 1] 加總。

例如上圖的 prices[6] - prices[3] ,其等同於求 (prices[4] - prices[3]) + (prices[5] - prices[4]) + (prices[6] - prices[5])

如此一來,連山峰山谷都不用找,只要將每一組滿足 prices[i] > prices[i - 1] 的 prices[i] - prices[i - 1] 之值全數加總即可。也就是直接掃過一次數列即可求出最大的利潤。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

更多創作