每日算法系列【LeetCode 188】买卖股票的最佳时机 IV

简介: 每日算法系列【LeetCode 188】买卖股票的最佳时机 IV

题目描述

给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。

设计一个算法来计算你所能获取的最大利润。你最多可以完成 k 笔交易。

注意: 你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

示例1

输入:
[2,4,1], k = 2
输出:
2
解释:
在第 1 天 (股票价格 = 2) 的时候买入,在第 2 天 (股票价格 = 4) 的时候卖出,这笔交易所能获得利润 = 4-2 = 2 。

示例2

输入:
[3,2,6,5,0,3], k = 2
输出:
7
解释:
在第 2 天 (股票价格 = 2) 的时候买入,在第 3 天 (股票价格 = 6) 的时候卖出, 这笔交易所能获得利润 = 6-2 = 4 。
随后,在第 5 天 (股票价格 = 0) 的时候买入,在第 6 天 (股票价格 = 3) 的时候卖出, 这笔交易所能获得利润 = 3-0 = 3 。

题解

这是 【买卖股票的最佳时机】 系列题目的第四题。

这题是最一般的情况了,也就是最多可以买卖  次。那么我们采用动态规划来求解。

令  为第  只股票之前(包含)买卖  次(且最后一次操作为买入)可以获得的最大利润, 为第  只股票之前(包含)买卖  次(且最后一次操作为卖出)可以获得的最大利润。

那么对于  来说,最后一次操作是买入,所以分为两种情况。

  • 一种是不买第  只股票,那么最大利润就是前  只股票买卖  次(且最后一次操作为买入)的最大利润:
  • 一种是买第  只股票,那么最大利润就是前  只股票买卖  次(且最后一次操作为卖出)的最大利润:

而对于  来说,最后一次操作是卖出,所以分为两种情况。

  • 一种是不卖第  只股票,那么最大利润就是前  只股票买卖  次(且最后一次操作为卖出)的最大利润:
  • 一种是卖第  只股票,那么最大利润就是前  只股票买卖  次(且最后一次操作为买入)的最大利润:

综上转移方程就是:

初始情况就是  和  时,单独计算一下就行了。

此外本题还可以优化成一维数组,就不展开介绍了,大家可以参考代码。

时间复杂度是  。

代码

python

class Solution:
    def maxProfit(self, k: int, prices: List[int]) -> int:
        n = len(prices)
        if n == 0: return 0
        if k >= n//2:
            res = 0
            for i in range(1, n):
                res += max(prices[i]-prices[i-1], 0)
            return res
        dp0 = [-prices[0]] * (k+1)
        dp1 = [0] * (k+1)
        for p in prices[1:]:
            for i in range(1, k+1):
                dp1[i] = max(dp1[i], dp0[i]+p)
                dp0[i] = max(dp0[i], dp1[i-1]-p)
        return max(dp1[k], 0)
相关文章
|
2天前
|
算法 索引
leetcode代码记录(买卖股票的最佳时机
leetcode代码记录(买卖股票的最佳时机
13 1
|
2天前
|
算法
leetcode代码记录(买卖股票的最佳时机 IV
leetcode代码记录(买卖股票的最佳时机 IV
14 2
|
2天前
|
算法
leetcode代码记录(买卖股票的最佳时机 III
leetcode代码记录(买卖股票的最佳时机 III
13 5
|
2天前
leetcode代码记录(买卖股票的最佳时机 II
leetcode代码记录(买卖股票的最佳时机 II
9 1
|
2天前
|
算法 数据安全/隐私保护 计算机视觉
基于二维CS-SCHT变换和LABS方法的水印嵌入和提取算法matlab仿真
该内容包括一个算法的运行展示和详细步骤,使用了MATLAB2022a。算法涉及水印嵌入和提取,利用LAB色彩空间可能用于隐藏水印。水印通过二维CS-SCHT变换、低频系数处理和特定解码策略来提取。代码段展示了水印置乱、图像处理(如噪声、旋转、剪切等攻击)以及水印的逆置乱和提取过程。最后,计算并保存了比特率,用于评估水印的稳健性。
|
2天前
|
算法 计算机视觉
基于高斯混合模型的视频背景提取和人员跟踪算法matlab仿真
该内容是关于使用MATLAB2013B实现基于高斯混合模型(GMM)的视频背景提取和人员跟踪算法。算法通过GMM建立背景模型,新帧与模型比较,提取前景并进行人员跟踪。文章附有程序代码示例,展示从读取视频到结果显示的流程。最后,结果保存在Result.mat文件中。
|
2天前
|
资源调度 算法 块存储
m基于遗传优化的LDPC码OMS译码算法最优偏移参数计算和误码率matlab仿真
MATLAB2022a仿真实现了遗传优化的LDPC码OSD译码算法,通过自动搜索最佳偏移参数ΔΔ以提升纠错性能。该算法结合了低密度奇偶校验码和有序统计译码理论,利用遗传算法进行全局优化,避免手动调整,提高译码效率。核心程序包括编码、调制、AWGN信道模拟及软输入软输出译码等步骤,通过仿真曲线展示了不同SNR下的误码率性能。
9 1
|
2天前
|
存储 算法 数据可视化
基于harris角点和RANSAC算法的图像拼接matlab仿真
本文介绍了使用MATLAB2022a进行图像拼接的流程,涉及Harris角点检测和RANSAC算法。Harris角点检测寻找图像中局部曲率变化显著的点,RANSAC则用于排除噪声和异常点,找到最佳匹配。核心程序包括自定义的Harris角点计算函数,RANSAC参数设置,以及匹配点的可视化和仿射变换矩阵计算,最终生成全景图像。
|
2天前
|
算法 Serverless
m基于遗传优化的LDPC码NMS译码算法最优归一化参数计算和误码率matlab仿真
MATLAB 2022a仿真实现了遗传优化的归一化最小和(NMS)译码算法,应用于低密度奇偶校验(LDPC)码。结果显示了遗传优化的迭代过程和误码率对比。遗传算法通过选择、交叉和变异操作寻找最佳归一化因子,以提升NMS译码性能。核心程序包括迭代优化、目标函数计算及性能绘图。最终,展示了SNR与误码率的关系,并保存了关键数据。
16 1
|
2天前
|
算法 调度
考虑需求响应的微网优化调度模型【粒子群算法】【matlab】
考虑需求响应的微网优化调度模型【粒子群算法】【matlab】