LeetCode 力扣题目:买卖股票的最佳时机 IV

❤️❤️❤️ 欢迎来到我的博客。希望您能在这里找到既有价值又有趣的内容,和我一起探索、学习和成长。欢迎评论区畅所欲言、享受知识的乐趣!

  • 推荐:数据分析螺丝钉的首页 格物致知 终身学习 期待您的关注
    在这里插入图片描述

  • 导航

    • LeetCode解锁1000题: 打怪升级之旅:每题都包括3-5种算法,以及详细的代码实现,刷题面试跳槽必备
    • 漫画版算法详解:通过漫画的形式和动态GIF图片把复杂的算法每一步进行详细可视解读,看一遍就掌握
    • python源码解读:解读python的源代码与调用关系,快速提升代码质量
    • python数据分析可视化:企业实战案例:企业级数据分析案例与可视化,提升数据分析思维和可视化能力
    • 程序员必备的数学知识与应用:全面详细的介绍了工程师都必备的数学知识

期待与您一起探索技术、持续学习、一步步打怪升级 欢迎订阅本专栏❤️❤️

买卖股票的问题在力扣(LeetCode)上是一个系列,涵盖了从简单到困难的多种变体,每个题目都有其特定的条件和限制。这里是一些常见题目的主要区别:

  1. 买卖股票的最佳时机121题

    • 条件:只允许完成一笔交易(即买入和卖出一次股票)。
    • 目标:求最大利润。
  2. 买卖股票的最佳时机 II 122题

    • 条件:可以进行多次交易,但必须在再次购买前出售掉之前的股票。
    • 目标:求最大利润。
  3. 买卖股票的最佳时机 III 123题

    • 条件:最多可以完成两笔交易。
    • 目标:求最大利润。

题目描述

给定一个整数数组 prices,其表示一支股票的价格变化;再给定一个整数 k,表示你最多可以完成 k 笔交易(买入和卖出算一笔交易,且每次交易之前必须卖出手中的股票)。请求出你能够获得的最大利润。

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

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

方法一:动态规划

解题步骤

  1. 定义状态 dp[i][j] 表示第 i 天结束时,进行了 j 次交易的最大利润。
  2. 对于每天的股票价格,更新买入和卖出状态:
    • dp[i][j] 可以由 dp[i-1][j](不操作)或 dp[i-1][j-1] - prices[i](买入)更新。
    • dp[i][j] 也可以通过 dp[i-1][j-1] + prices[i](卖出)更新。
  3. 初始化状态,dp[0][...] = 0 或根据第一天的操作调整。
  4. 遍历完成后,dp[n-1][k] 为最大利润。

Python 示例

def maxProfit(k, prices):
    n = len(prices)
    if n < 2:
        return 0
    if k >= n // 2:
        return sum(x - y for x, y in zip(prices[1:], prices[:-1]) if x > y)
    dp = [[0] * (k + 1) for _ in range(n)]
    for j in range(1, k + 1):
        max_buy = -prices[0]
        for i in range(1, n):
            dp[i][j] = max(dp[i - 1][j], prices[i] + max_buy)
            max_buy = max(max_buy, dp[i - 1][j - 1] - prices[i])
    return dp[-1][k]

# Example usage
k = 2
prices = [2, 4, 1]
print(maxProfit(k, prices))  # Output: 2

算法分析

  • 时间复杂度:O(n*k),其中 n 是数组的长度。
  • 空间复杂度:O(n*k),用于存储 dp 数组。

算法图解与说明

初始: dp = [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
第一天: 不操作或买入
第二天: 卖出或继续持有
第三天: 选择最优操作

方法二:优化空间的动态规划

解题步骤

  1. 使用滚动数组优化空间复杂度,仅使用两行来存储当前和前一天的状态。
  2. 同样遵循动态规划的状态转移方程,但在每天结束后,将当前天的状态复制到“前一天”数组中。
  3. 通过优化状态转移的方式,减少空间使用,确保算法更高效。

Python 示例

def maxProfit(k, prices):
    n = len(prices)
    if n < 2:
        return 0
    if k >= n // 2:
        return sum(max(prices[i + 1] - prices[i], 0) for i in range(n - 1))
    
    dp = [[0] * (k + 1) for _ in range(2)]
    for j in range(1, k + 1):
        max_buy = -prices[0]
        for i in range(1, n):
            dp[i % 2][j] = max(dp[(i - 1) % 2][j], prices[i] + max_buy)
            max_buy = max(max_buy, dp[(i - 1) % 2][j - 1] - prices[i])
    return dp[(n - 1) % 2][k]

# Example usage
k = 2
prices = [2, 4, 1]
print(maxProfit(k, prices))  # Output: 2

算法分析

  • 时间复杂度: O(n*k),其中 n 是股票价格的天数。
  • 空间复杂度: O(k),因为我们只保持了两个长度为 k+1 的数组。

算法图解与说明

假设 k=2, prices=[2, 4, 1]

使用滚动数组优化:
初始: dp[0][...] = [0, 0, 0]
      dp[1][...] = [0, 0, 0]
第1天: max_buy = -2
第2天: dp[1][1] = max(dp[0][1], 4 - 2)
       dp[1][2] = max(dp[0][2], dp[0][1] - 2)
继续更新...

方法三:局部最优与全局最优解法

解题步骤

  1. 使用两个数组 localglobal 来存储局部最优和全局最优的利润。
  2. local[i][j] 表示到达第 i 天时最多进行 j 次交易,并且最后一次交易在第 i 天卖出的最大利润。
  3. global[i][j] 表示到达第 i 天时最多进行 j 次交易的最大利润。
  4. 更新规则:
    • local[i][j] = max(global[i-1][j-1] + max(0, prices[i] - prices[i-1]), local[i-1][j] + (prices[i] - prices[i-1]))
    • global[i][j] = max(global[i-1][j], local[i][j])

Python 示例

def maxProfit(k, prices):
    n = len(prices)
    if n < 2 or k <= 0:
        return 0
    if k >= n // 2:
        return sum(max(prices[i + 1] - prices[i], 0) for i in range(n - 1))
    
    local = [[0] * (k + 1) for _ in range(n)]
    global_profit = [[0] * (k + 1) for _ in range(n)]
    for i in range(1, n):
        delta = prices[i] - prices[i - 1]
        for j in range(1, k + 1):
            local[i][j] = max(global_profit[i-1][j-1] + max(delta, 0), local[i-1][j] + delta)
            global_profit[i][j] = max(global_profit[i-1][j], local[i][j])
    
    return global_profit[-1][k]

# Example usage
k = 2
prices = [2, 4, 1]
print(maxProfit(k, prices))  # Output: 2

算法分析

  • 时间复杂度: O(n*k),每天的每个交易次数都进行了计算。
  • 空间复杂度: O(n*k),存储局部和全局最优利润。

算法图解与说明

股票价格:  [2, 4, 1]
local 和 global 更新:
第2天 (价格4): local[1][1] = max(global[0][0] + 2, 0) = 2
              global[1][1] = max(global[0][1], local[1][1]) = 2
继续追踪并更新所有局部和全局最优解...

这些方法提供了不同的策略来处理买卖股票的最佳时机问题,特别是当交易次数有限制时。每种方法都有其适用场景和优缺点,可以根据具体需求和资源情况选择最合适的策略。

🌹🌹如果觉得这篇文对你有帮助的话,记得一键三连关注、赞👍🏻、收藏是对作者最大的鼓励,非常感谢 ❥(^_-)

❤️❤️作者知识有限,如有错误,请各位大佬评论区批评指正,不胜感激❥(^_-)
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/622956.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

华为手机恢复出厂设置后怎么还原数据?该如何预防数据丢失?

华为手机恢复出厂设置是将手机恢复到出厂时的初始状态&#xff0c;同时会删除所有用户数据和个人设置。如果不做任何预防措施&#xff0c;在恢复出厂设置后&#xff0c;您将丢失手机上的所有数据。那华为手机恢复出厂设置后怎么还原数据呢&#xff1f;以下是关于如何在华为手机…

Mac下安装ffmpeg

1、安装gedit brew install gedit2、配置环境变量&#xff0c;打开~/.zshrc&#xff0c;在末尾添加语句 export PATH$PATH:/usr/local/ffmpeg/bin3、执行语句&#xff0c;使环境变量生效 source ~/.zshrc 4、终端输入 ffmpeg &#xff0c;看环境变量是否配置成功。 至此&a…

c++高级篇(一) —— 初识Linux下的进程控制

linux的信号 信号的概念 在Linux中&#xff0c;信号是一种用于进程间通信和处理异步事件的机制&#xff0c;用于进程之间相互传递消息和通知进程发生了事件&#xff0c;但是&#xff0c;它不能给进程传递任何数据。 信号产生的原因有很多种&#xff0c;在shell中&#xff0c…

栈和队列的基础知识,C语言实现及经典OJ题

题目来源&#xff1a;力扣 基础知识 一.栈 1.栈的概念 定义&#xff1a;堆栈又名栈&#xff08;stack&#xff09;&#xff0c;它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶&#xff0c;相对地&#xff0c;把另一端称为栈底。 压…

【数据结构】栈和队列OJ面试题

20. 有效的括号 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a;由于C语言没有栈的接口&#xff0c;所以我们需要自己造一个“模子”。我们直接copy之前的实现的栈的接口就可以了&#xff08;可以看我之前的博客【数据结构】栈和队列-CSDN博客copy接口&#xff09;&…

OpenSSL自签证书并基于Express搭建Web服务进行SSL/TLS协议分析

OpenSSL自签证书并基于Express搭建Web服务进行SSL/TLS协议分析 起因 最近在学习安全协议&#xff0c;大多数实验都是基于Windows下IIS&#xff0c;或者Linux下nginx搭建的Web服务&#xff0c;搭建环境和编写配置文件比较麻烦。而且我有多个不同环境的设备&#xff0c;折腾起来…

Hive-拉链表的设计与实现

Hive-拉链表的设计与实现 在Hive中&#xff0c;拉链表专门用于解决在数据仓库中数据发生变化如何实现数据存储的问题。 1.数据同步问题 Hive在实际工作中主要用于构建离线数据仓库&#xff0c;定期的从各种数据源中同步采集数据到Hive中&#xff0c;经过分层转换提供数据应用…

计算机视觉的应用30-基于深度卷积神经网络CNN模型实现物体表面缺陷检测技术的项目

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下计算机视觉的应用30-基于深度卷积神经网络CNN模型实现物体表面缺陷检测技术的项目主要包括&#xff1a;物体表面缺陷检测技术项目介绍&#xff0c;数据构造&#xff0c;模型介绍。 物体表面缺陷检测技术是工业自动化…

四川汇聚荣:做拼多多网点需要具备什么能力?

做拼多多网点需要具备什么能力?这个问题对于想要在电商平台上开店的商家来说&#xff0c;是必须要了解的。拼多多作为国内领先的社交电商平台&#xff0c;吸引了众多商家入驻。那么&#xff0c;要想在拼多多上开网店&#xff0c;需要具备哪些能力呢?下面就从四个方面进行详细…

Android Cursor与Adapter结合使用

查询数据库均会把查询的结果包装在一个Cursor的子类对象中返回。Cursor就像是位于结果集之上的一个游标&#xff0c;可以对结果集进行向前、向后或随机的访问。而Cursor本身是一个接口类&#xff0c;提供了对结果集访问的一些抽象方法&#xff0c;根据功能的不同在其子类有着不…

Python | Leetcode Python题解之第88题合并两个有序数组

题目&#xff1a; 题解&#xff1a; class Solution:def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:"""Do not return anything, modify nums1 in-place instead."""p1, p2 m - 1, n - 1tail m n - 1whi…

elasticsearch 动态映射

文章目录 动态映射动态映射的弊端静态映射实战&#xff1a;映射创建后还可以更新吗 动态映射 动态映射的核心是在自动检测字段类型后添加新字段 哪些字段类型支持动态检测呢&#xff1f; 答&#xff1a;boolean类型、float类型、long类型、Object类型、Array类型、date类型、…

MQTT学习(一)

MQTT是一种与HTTP类似的应用层协议。 在某些物联网应用中&#xff0c;MQTT优于HTTP。 首先&#xff0c;HTTP是用于客户端服务器计算的以文档为中心的请求-响应协议。 HTTP是万维网的基础&#xff0c;但它不是专门为机器之间通信而设计的。 MQTT是一种机器对机器、以数据为中…

重学java 37.多线程基本了解

尽管走自己的路&#xff0c;别被那些三言两语击倒 —— 24.5.13 一、多线程_线程和进程 进程&#xff1a;在内存中执行的应用程序 线程:是进程中最小的执行单元线程作用:负责当前进程中程序的运行,一个进程中至少有一个线程,一个进程还可以有多个线程,这…

Automa:一键自动化,网页数据采集与工作流程优化专家

Automa&#xff1a;解锁自动化浏览器潜能&#xff0c;赋能工作效率&#xff0c;让复杂任务变得简单- 精选真开源&#xff0c;释放新价值。 概览 Automa是一款创新的网页自动化工具&#xff0c;专为寻求提升工作效率、简化数据收集过程的现代工作者设计。它融合了先进的数据抓取…

EasyExcel 中实体类的注解@ExcelProperty

ExcelProperty(value "职务", index 0) value 与index 的优先级, 实测得出下面结论. 1、只有value : 按照value 的匹配 2、只有index: 按照index 的匹配 3、 同时有value和index: 按照index的匹配. 结果: 按照index的匹配, 找到的数据 {"administrat…

GO—web程序中的请求缓存设置

背景 假设用户数据存在数据库&#xff0c;现在需要一个函数&#xff0c;通过用户名称返回用户信息。 期望&#xff1a;在一次web请求中&#xff0c;不过调用多少次这个函数&#xff0c;只请求一次数据库。 基本信息 type User struct {Name stringAge int }func GetALLUser…

服务器3389端口,服务器3389端口风险提示的应对措施

3389端口是Windows操作系统中远程桌面协议&#xff08;RDP&#xff09;的默认端口。一旦该端口被恶意攻击者利用&#xff0c;可能会导致未经授权的远程访问和数据泄露等严重安全问题。 针对此风险&#xff0c;强烈建议您采取以下措施&#xff1a; 1. 修改默认端口&#xff1a;…

苹果手机系统恢复工具:轻松解决iPhone各类系统问题!

随着苹果手机的iOS系统不断升级&#xff0c;越来越多的系统问题不断出现&#xff0c;如卡在恢复模式、系统崩溃白苹果、应用无响应、等&#xff0c;这些问题不仅影响用户体验&#xff0c;还可能导致手机无法正常使用。 遇到系统问题&#xff0c;一般我们可以先尝试使用强制重启…

【原创】springboot+mysql校园宿舍报修管理系统设计与实现

个人主页&#xff1a;程序猿小小杨 个人简介&#xff1a;从事开发多年&#xff0c;Java、Php、Python、前端开发均有涉猎 博客内容&#xff1a;Java项目实战、项目演示、技术分享 文末有作者名片&#xff0c;希望和大家一起共同进步&#xff0c;你只管努力&#xff0c;剩下的交…