力扣刷題筆記:188. 買賣股票的最佳時機 IV(動態規劃+貪心演算法,優秀演算法搬運,詳細解析)
題目:
188.買賣股票的最佳時機 IV
給定一個整數陣列 prices ,它的第 i 個元素 prices[i] 是一支給定的股票在第 i 天的價格。
設計一個演算法來計算你所能獲取的最大利潤。你最多可以完成 k 筆交易。
注意:你不能同時參與多筆交易(你必須在再次購買前出售掉之前的股票)。
示例 1:
輸入:k = 2, prices = [2,4,1] 輸出:2 解釋:在第 1 天 (股票價格 = 2) 的時候買入,在第 2 天
(股票價格 = 4) 的時候賣出,這筆交易所能獲得利潤 = 4-2 = 2 。
示例 2:
輸入:k = 2, prices = [3,2,6,5,0,3] 輸出:7 解釋:在第 2 天 (股票價格 = 2) 的時候買入,在第 3
天 (股票價格 = 6) 的時候賣出, 這筆交易所能獲得利潤 = 6-2 = 4 。
隨後,在第 5 天 (股票價格 = 0) 的時候買入,在第 6 天 (股票價格 = 3) 的時候賣出, 這筆交易所能獲得利潤 = 3-0 = 3 。
提示:
0 <= k <= 109
0 <= prices.length <= 1000
0 <= prices[i] <= 1000
題解:
解題思路:
首先要確定k的取值範圍否則會產生超時的問題,因為買賣佔用兩天,所以分情況執行。。。
if:k>=n//2,會變成122題,解法此處略過(見程式碼註釋);
else:因為只能持有一隻股票,因此流程肯定是[買,賣…,買,賣]把成本和利潤創造兩個一維陣列,長短為k+1,就是尋找最小成本然後計算最大利潤。
注:當k=1時,即為尋找算小价格然後計算最大利潤。
題解程式碼:
class Solution:
def maxProfit(self, k: int, prices: List[int]) -> int:
n = len(prices)
if n <= 1: return 0 #如果只有一天的股票價格,則不存在交易
if k >= n//2: #如果交易次數k大於總天數整除2,即相當於交易次數無限制
profit = 0
#交易次數無限制,則只要統計後一天大於前一天的總和,即為最大利潤
for i in range(1, len(prices)):
if prices[i] > prices[i-1]:
profit += prices[i] - prices[i-1]
return profit
else:
# k < n//2 時,交易次數有限制
# 定義初始成本為無窮大
cost = [float('inf') for i in range(k+1)]
# 定義初始利潤為0
profit = [0 for i in range(k+1)]
# 進行成本動態規劃,貪心演算法
for p in prices:
for i in range(1, k+1):
#print(cost[i], p-profit[i-1])
cost[i] = min(cost[i], p-profit[i-1])
#print(profit[i], p-cost[i])
profit[i] = max(profit[i], p-cost[i])
#print(p, i, profit, cost)
return profit[-1]
演算法確實高階!
作者:riven-iz
連結:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-iv/solution/yi-wei-shu-zu-xiao-bai-jie-fa-yong-shi-chao-yue-97/
來源:力扣(LeetCode)https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-iv