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

news2024/12/23 4:32:39

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

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

  • 导航

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

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

题目描述

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

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

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

示例:

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

方法一:动态规划

解题步骤

  1. 定义状态:dp[i][j] 表示第 i 天完成 j 笔交易的最大利润。
  2. 初始化状态:dp[0][1]dp[0][2] 都初始化为负无穷,表示不可能完成交易。
  3. 状态转移:
    • i 天完成一笔交易的最大利润:dp[i][1] = max(dp[i-1][1], -prices[i])
    • i 天完成两笔交易的最大利润:dp[i][2] = max(dp[i-1][2], dp[i-1][1] + prices[i])
  4. 结果输出:max(dp[n-1][1], dp[n-1][2])

Python 示例

def maxProfit(prices):
    n = len(prices)
    if n == 0:
        return 0
    dp = [[0] * 3 for _ in range(n)]
    dp[0][1] = -prices[0]
    dp[0][2] = float('-inf')
    
    for i in range(1, n):
        dp[i][1] = max(dp[i-1][1], -prices[i])
        dp[i][2] = max(dp[i-1][2], dp[i-1][1] + prices[i])

    return max(0, dp[n-1][2])

# Example usage
prices = [3,3,5,0,0,3,1,4]
print(maxProfit(prices))  # Output: 6

算法分析

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

算法图解与说明

初始: dp = [[-3, -inf], [0, 0], [0, 0], ...]
第一天: 不操作,买入 -3
第二天: 不操作,维持 -3
第三天: 不操作,维持 -3
第四天: 不操作,买入 0
第五天: 不操作,维持 0
第六天: 卖出 +3
第七天: 买入 1
第八天: 卖出 +4

方法二:状态机优化

解题步骤

  1. 使用四个变量表示不同状态下的最大利润:buy1, sell1, buy2, sell2
  2. 初始状态设为:buy1 = buy2 = -inf, sell1 = sell2 = 0
  3. 更新状态机:
    • buy1: 第一次买入的最大利润
    • sell1: 第一次卖出的最大利润
    • buy2: 第二次买入的最大利润
    • sell2: 第二次卖出的最大利润

Python 示例

def maxProfit(prices):
    buy1, sell1, buy2, sell2 = float('-inf'), 0, float('-inf'), 0
    for price in prices:
        buy1 = max(buy1, -price)
        sell1 = max(sell1, buy1 + price)
        buy2 = max(buy2, sell1 - price)
        sell2 = max(sell2, buy2 + price)
    return sell2

# Example usage
prices = [3,3,5,0,0,3,1,4]
print(maxProfit(prices))  # Output: 6

算法分析

  • 时间复杂度:O(N)
  • 空间复杂度:O(1)

算法图解与说明

状态更新过程:
初始: buy1 = -inf, sell1 = 0, buy2 = -inf, sell2 = 0
价格迭代: 3 -> buy1 = -3
          3 -> sell1 = 0
          5 -> sell1 = 2
          0 -> buy2 = 2
          0 -> 维持
          3 -> sell2 = 5
          1 -> 维持
          4 -> sell2 = 6

这两种方法为买卖股票问题的高级解法,适用于有多次交易机会的场景。

方法三:左右扫描数组法

解题步骤

  1. 使用两个数组 left_profitsright_profitsleft_profits[i] 存储从第一天到第 i 天的最大利润,right_profits[i] 存储从第 i 天到最后一天的最大利润。
  2. 从左到右遍历一遍股价数组,更新 left_profits 为到当前日为止的最大利润。
  3. 从右到左遍历股价数组,更新 right_profits 为从当前日到结束的最大利润。
  4. 最终结果为某一天两边利润之和的最大值。

Python 示例

def maxProfit(prices):
    n = len(prices)
    if n <= 1:
        return 0
    
    left_profits = [0] * n
    right_profits = [0] * n
    
    # 左侧最小值初始化
    min_price = prices[0]
    for i in range(1, n):
        left_profits[i] = max(left_profits[i-1], prices[i] - min_price)
        min_price = min(min_price, prices[i])
    
    # 右侧最大值初始化
    max_price = prices[n-1]
    for i in range(n-2, -1, -1):
        right_profits[i] = max(right_profits[i+1], max_price - prices[i])
        max_price = max(max_price, prices[i])
    
    # 计算两边利润的最大和
    max_profit = 0
    for i in range(n):
        max_profit = max(max_profit, left_profits[i] + right_profits[i])
    
    return max_profit

# Example usage
prices = [3,3,5,0,0,3,1,4]
print(maxProfit(prices))  # Output: 6

算法分析

  • 时间复杂度:O(N),其中 N 是数组的长度。
  • 空间复杂度:O(N),需要两个长度为 N 的数组来存储左右两侧的最大利润。

算法图解与说明

股票价格:  [3, 3, 5, 0, 0, 3, 1, 4]
左侧利润:  [0, 0, 2, 2, 2, 2, 2, 2]
右侧利润:  [3, 3, 3, 3, 3, 3, 3, 0]
最大利润:  每天两侧利润之和的最大值为 6 (第 6 天)

方法四:改进的状态机方法

解题步骤

  1. 减少状态机方法中变量的使用,只使用两个变量跟踪到目前为止的最大利润。
  2. 遍历价格数组时,更新四个关键状态:第一次买入、第一次卖出、第二次买入和第二次卖出的最大利润。
  3. 通过逐步更新这四个状态来最大化最终的利润。

Python 示例

def maxProfit(prices):
    first_buy, first_sell = float('-inf'), 0
    second_buy, second_sell = float('-inf'), 0
    for price in prices:
        first_buy = max(first_buy, -price)
        first_sell = max(first_sell, first_buy + price)
        second_buy = max(second_buy, first_sell - price)
        second_sell = max(second_sell, second_buy + price)
    return second_sell

# Example usage
prices = [3,3,5,0,0,3,1,4]
print(maxProfit(prices))  # Output: 6

算法分析

  • 时间复杂度:O(N),N 是股票价格数组的长度。
  • 空间复杂度:O(1),使用常数空间。

算法图解与说明

初始状态: first_buy = -inf, first_sell = 0, second_buy = -inf, second_sell = 0
更新过程:
- 第1天: first_buy 更新为 -3
- 第2天: 无变化
- 第3天: first_sell 更新为 2
- 第4天: second_buy 更新为 2
- 第5天: 无变化
- 第6天: second_sell 更新为 5
- 第7天: 无变化
- 第8天: second_sell 更新为 6

以上四种方法各有优势,适用于不同的场景和优化需求。可以根据具体需要选择最合适的解决方案。

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

template——模板进阶(C++)

在之前的文章中&#xff0c;介绍了模板初阶&#xff1a;Cpp_桀桀桀桀桀桀的博客-CSDN博客 在本篇中将会对模板进一步的讲解。本篇中的主要内容为&#xff1a;非类型模板参数、函数模板的特化、类模板的特化&#xff08;其中包含全特化和偏特化&#xff09;&#xff0c;最后讲解…

什么是数据中心?关于数据中心的这些知识一定要知道

在数字化时代&#xff0c;数据已成为企业最宝贵的资产之一。数据中心&#xff0c;作为支撑海量数据存储、处理和分发的基础设施&#xff0c;其战略地位日益凸显。它们不仅是信息技术的心脏&#xff0c;更是推动现代商业决策、创新和运营的核心引擎。随着云计算、大数据、物联网…

React 第三十章 React 和 Vue 描述页面的区别

面试题&#xff1a;React 和 Vue 是如何描述 UI 界面的&#xff1f;有一些什么样的区别&#xff1f; 标准且浅显的回答&#xff1a; React 中使用的是 JSX&#xff0c;Vue 中使用的是模板来描述界面 前端领域经过长期的发展&#xff0c;目前有两种主流的描述 UI 的方案&#xf…

英语学习笔记12——名词所有格的运用

Whose is this … ? This is my/your/his/her … 这……是谁的&#xff1f;这是我的 / 你的 / 他的 / 她的…… Whose is that … ? That is my/your/his/her … 那……是谁的&#xff1f;那是我的 / 你的 / 他的 / 她的…… 词汇 Vocabulary father n. 爸爸 口语&#xf…

ICode国际青少年编程竞赛- Python-6级训练场-多次递归

ICode国际青少年编程竞赛- Python-6级训练场-多次递归 1、 def recur(n):# 边界条件if n<1:return# 额外动作Dev.turnLeft()Dev.step(n)Dev.turnRight()Dev.step(n)Dev.step(-n)Dev.turnRight()Dev.step(2*n)Dev.turnLeft()Dev.step(n)# 递归调用recur(n-1) recur(4)2、 d…

详解xlswriter 操作Excel的高级应用conditional_format

在文章详解xlsxwriter 操作Excel的常用API-CSDN博客 我们介绍了xlswriter 基础api的使用情况&#xff0c;在实际工作中我们经常会遇到下面的需求&#xff0c;cell满足某某条件时&#xff0c;进行对应的格式化处理。这时候我们可以使用conditional_format的函数&#xff0c;他允…

Softing dataFEED OPC Suite通过OPC UA标准加速数字化转型

数字化转型的关键在于成功将信息技术&#xff08;IT&#xff09;与运营技术&#xff08;OT&#xff09;相融合&#xff0c;例如将商业应用程序和服务器与可编程逻辑控制器&#xff08;PLC&#xff09;和设备传感器相融合&#xff0c;为此&#xff0c;各种设备和系统必须能够相互…

ERP系统为何适合电子元件行业?

在快速发展的电子元件行业中&#xff0c;高效、精确的管理系统对于企业的成功至关重要。IC设计ERP系统&#xff0c;作为一套高度集成的企业管理解决方案&#xff0c;其独特的特性和功能使其特别适用于电子元件行业。 首先&#xff0c;ERP系统(Enterprise Resource Planning&…

钽酸锂集成光子芯片:引领光电集成新纪元

在信息技术飞速发展的今天&#xff0c;光电集成技术已成为推动全球集成电路产业持续创新的重要力量。随着全球集成电路产业发展步入“后摩尔时代”&#xff0c;芯片性能提升的难度和成本不断攀升&#xff0c;业界急需寻找新的技术突破口。在这一背景下&#xff0c;中国科学院上…

【深度学习目标检测】二十六、基于深度学习的垃圾检测系统-含数据集、GUI和源码(python,yolov8)

设计垃圾检测系统的意义在于多个方面&#xff0c;这些方面不仅关乎环境保护和城市管理&#xff0c;还涉及到技术进步和社会效益。以下是设计垃圾检测系统的主要意义&#xff1a; 环境保护与资源回收&#xff1a; 垃圾检测系统能够有效地识别不同种类的垃圾&#xff0c;帮助人们…

江苏省人大财经委主任委员谢志成一行莅临聚合数据走访调研

4月18日&#xff0c;江苏省人大财经委主任委员谢志成莅临聚合数据展开考察调研。省人大财经委副主任委员&#xff08;正厅&#xff09;周毅、省人大常委会办公厅一级巡视员吕小鹏、外事委委员赵正驰、省数据局副局长王万军&#xff1b;苏州市人大常委会副秘书长毛元龙、数据局副…

快手二面:你有没有调用过第三方接口?碰到过哪些坑?

在我们的业务开发中&#xff0c;调用第三方接口已经成为常态&#xff0c;比如对接一些ERP系统、WMS系统、一些数据服务系统等&#xff0c;它极大地扩展了我们应用的功能和服务范围。然而&#xff0c;实际对接过程中&#xff0c;我们往往会在这一环节遇到各种意想不到的问题&…

【自动驾驶技术栈学习】1-硬件《大话自动驾驶》| 综述要点总结 by.Akaxi

----------------------------------------------------------------------------------------------------------------- 致谢&#xff1a;感谢十一号线人老师的《大话自动驾驶》书籍&#xff0c;收获颇丰 链接&#xff1a;大话自动驾驶 (豆瓣) (douban.com) -------------…

【科学研究】 女性主义:网络中的性别歧视现象

::: block-1 “时问桫椤”是一个致力于为本科生到研究生教育阶段提供帮助的不太正式的公众号。我们旨在在大家感到困惑、痛苦或面临困难时伸出援手。通过总结广大研究生的经验&#xff0c;帮助大家尽早适应研究生生活&#xff0c;尽快了解科研的本质。祝一切顺利&#xff01;—…

##20 实现图像风格迁移:使用PyTorch深入学习的艺术之旅

文章目录 前言项目概述准备阶段图像处理模型选择风格和内容特征提取风格迁移算法优化过程结果展示完整代码与实验项目结论参考文献 前言 图像风格迁移是一种使一幅图像呈现另一幅画作风格的技术&#xff0c;通过深度学习&#xff0c;我们能够捕捉到内容图像的结构信息和风格图…

函数memcpy的实现及详解

前言 今天我们来了解一下memcpy函数和它的作用吧&#xff0c;咋们之前已经熟悉了strcpy的使用&#xff0c;它的作用是字符串的拷贝&#xff0c;那么当我们要拷贝其他类型的数据时&#xff0c;应该使用什么函数呢&#xff0c;我们今天给大家介绍的就是memcpy函数&#xff0c;他可…

1960—2021年中国月日均温降水时间序列

基于均质级数&#xff08;MASH&#xff09;和气候多元分析方法&#xff0c;首先对1960—2021年中国366个站点的日均气温、最高气温、最低气温和降水量进行不均匀性检测、估计和调整&#xff0c;建立均质化日气温和降水数据集。所有数据集均由希腊&#xff08;帕特雷大学物理系大…

Quests system for Unity

一个简单而灵活的任务系统将帮助你实现所有的想法,而不需要事件和逻辑中的一堆额外代码! 我的资产是一个用于执行任务的独立系统。 特征: 任务逻辑不需要继承MonoBehaviour。 在一行中完成所需任务的激活/进度/完成。 易于理解的界面,包含项目中所有任务的列表。 不需要连接…

【kubeflow文档】kubeflow介绍与架构

1. kubeflow介绍 Kubeflow项目致力于使机器学习&#xff08;ML&#xff09;工作流在Kubernetes上的部署变得简单、可移植和可扩展。目标不是重新创建其他服务&#xff0c;而是提供一种直接的方法&#xff0c;将ML的开源系统部署到不同的基础设施中。无论在哪里运行Kubernetes&a…

Android PreferenceActivity可以自动设置的Activity

1、介绍 PreferenceActivity 是一个抽象类&#xff0c;继承自ListActivity ,该类封装了SharedPreferences. PreferenceActivity 提供了一些常用的设置项如,与普通组件一样&#xff0c;这些配置项既可以从XML文件创建&#xff0c;也可以从代码创建. 每一个设置项标签有一个andro…