题目:
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