1. 程式人生 > 其它 >力扣刷題筆記:188. 買賣股票的最佳時機 IV(動態規劃+貪心演算法,優秀演算法搬運,詳細解析)

力扣刷題筆記:188. 買賣股票的最佳時機 IV(動態規劃+貪心演算法,優秀演算法搬運,詳細解析)

技術標籤:刷題筆記leetcodepython貪心演算法

題目:

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