題目描述
給定一個數組,它的第 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;
}
}
其實就是貪心算法的思路