当前位置: 首页 > news >正文

代码随想录算法训练营Day 49 || 123.买卖股票的最佳时机III 、188.买卖股票的最佳时机IV

123.买卖股票的最佳时机III

力扣题目链接(opens new window)

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

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

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

  • 示例 1:

  • 输入:prices = [3,3,5,0,0,3,1,4]

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

  • 示例 2:

  • 输入:prices = [1,2,3,4,5]

  • 输出:4 解释:在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4。注意你不能在第 1 天和第 2 天接连购买股票,之后再将它们卖出。因为这样属于同时参与了多笔交易,你必须在再次购买前出售掉之前的股票。

  • 示例 3:

  • 输入:prices = [7,6,4,3,1]

  • 输出:0 解释:在这个情况下, 没有交易完成, 所以最大利润为0。

  • 示例 4:

  • 输入:prices = [1] 输出:0

提示:

  • 1 <= prices.length <= 10^5
  • 0 <= prices[i] <= 10^5

解题思路:

  1. 定义状态: 由于最多可以进行两笔交易,我们需要跟踪四个状态:第一次买入(first_buy)、第一次卖出(first_sell)、第二次买入(second_buy)、第二次卖出(second_sell)。

  2. 初始化状态:

    • first_buy 初始化为负无穷大,因为还没有进行任何买入操作。
    • first_sellsecond_buysecond_sell 都初始化为0,因为初始利润为0。
  3. 状态转移:

    • 对于每一天的价格,更新上述四个状态。
    • first_buy:选择之前的 first_buy 或者当天的价格(负数,因为是花费)中的较大者。
    • first_sell:选择之前的 first_sell 或者今天的价格加上 first_buy(代表卖出)中的较大者。
    • second_buy:选择之前的 second_buy 或者 first_sell 减去今天的价格中的较大者。
    • second_sell:选择之前的 second_sell 或者今天的价格加上 second_buy 中的较大者。
  4. 计算结果:

    • 遍历完所有价格后,second_sell 就是最大利润。
class Solution:def maxProfit(self, prices: List[int]) -> int:if not prices:return 0first_buy, first_sell = -float('inf'), 0second_buy, second_sell = -float('inf'), 0for 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  # 返回最大利润

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 <= 100
  • 0 <= prices.length <= 1000
  • 0 <= prices[i] <= 1000

解题思路:

  1. 状态定义: 定义 dp[i][j] 作为一个二维数组,其中 i 表示天数,j 表示交易次数(每次交易包括买和卖两个动作)。dp[i][j] 表示第 i 天完成 j 笔交易能获得的最大利润。

  2. 初始化:

    • 对于 dp[0][..](即第0天),无论交易次数如何,利润都是0,因为没有交易发生。
    • 对于 dp[..][0](即没有交易),无论天数如何,利润都是0。
  3. 状态转移:

    • 需要决定第 i 天是买入、卖出还是不操作。这可以通过比较不同选择下的利润来决定。
    • 对于买入操作,我们要找到之前某天 m,使得 dp[m][j-1] - prices[i](即第 m 天完成 j-1 笔交易后的利润减去第 i 天的股价)最大。
    • 对于卖出操作,我们要找到之前某天 m,使得 dp[m][j-1] + prices[i] 最大。
    • 对于不操作,直接保持前一天的状态,即 dp[i][j] = dp[i-1][j]
  4. 结果计算:

    • 最后 dp[n-1][k](其中 n 是天数)就是在给定的条件下可以获得的最大利润。
class Solution:def maxProfit(self, k: int, prices: List[int]) -> int:if not prices:return 0n = len(prices)if k >= n // 2:return self.maxProfitInf(prices)dp = [[0] * (k + 1) for _ in range(n)]for j in range(1, k + 1):max_diff = -prices[0]for i in range(1, n):dp[i][j] = max(dp[i-1][j], prices[i] + max_diff)max_diff = max(max_diff, dp[i-1][j-1] - prices[i])return dp[-1][-1]def maxProfitInf(self, prices: List[int]) -> int:profit = 0for i in range(1, len(prices)):if prices[i] > prices[i-1]:profit += prices[i] - prices[i-1]return profit

 

 

相关文章:

代码随想录算法训练营Day 49 || 123.买卖股票的最佳时机III 、188.买卖股票的最佳时机IV

123.买卖股票的最佳时机III 力扣题目链接(opens new window) 给定一个数组&#xff0c;它的第 i 个元素是一支给定的股票在第 i 天的价格。 设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。 注意&#xff1a;你不能同时参与多笔交易&#xff08;你必须…...

threejs(11)-精通着色器编程(难点)2

一、shader着色器编写高级图案 小日本国旗 precision lowp float; varying vec2 vUv; float strength step(0.5,distance(vUv,vec2(0.5))0.25) ; gl_FragColor vec4(strength,strength,strength,strength);绘制圆 precision lowp float; varying vec2 vUv; float strength 1…...

配置cuda和cudnn出现 libcudnn.so.8 is not a symbolic link问题

cuda版本为11.2 问题如图所示&#xff1a; 解决办法&#xff1a; sudo ln -sf /usr/local/cuda-11.2/targets/x86_64-linux/lib/libcudnn_adv_train.so.8.1.1 /usr/local/cuda-11.2/targets/x86_64-linux/lib/libcudnn_adv_train.so.8 sudo ln -sf /usr/local/cuda-11.2/targ…...

“目标值排列匹配“和“背包组合问题“的区别和leetcode例题详解

1 目标值排列匹配 1.1 从目标字符串的角度来看&#xff0c;LC139是一个排列问题&#xff0c;因为最终目标子串的各个字符的顺序是固定的&#xff1f; 当我们从目标字符串 s 的角度来看 LC139 “单词拆分” 问题&#xff0c;确实可以认为它涉及到排列的概念&#xff0c;但这种…...

火星加载WMTS服务

这是正常的加载瓦片 http://192.168.1.23:8008/geoserver/mars3d/gwc/service/wmts?tilematrixEPSG%3A4326%3A7&layermars3d%3Abuffer&style&tilerow46&tilecol197&tilematrixsetEPSG%3A4326&formatimage%2Fpng&serviceWMTS&version1.0.0&…...

为什么要学习去使用云服务器,外网 IP能干什么,MAC使用Termius连接阿里云服务器。保姆级教学

目录 引言 可能有人想问为什么要学习云服务器&#xff1f; &#xff08;获取Linux环境&#xff0c;获得外网IP) 二、安装教程 引言 可能有人想问为什么要学习云服务器&#xff1f; &#xff08;获取Linux环境&#xff0c;获得外网IP) 1.虚拟机&#xff08;下策&#xff09; …...

VS c++多文件编译

前言&#xff1a;记录下我这个菜鸡学习的过程&#xff0c;如有错误恳请指出&#xff0c;不胜感激&#xff01; 1.简单多文件编译调试 文件目录&#xff1a; 编译&#xff1a; -g选项是告诉编译器生成调试信息&#xff0c;这样可以在程序崩溃或出现错误时更容易地进行调试。这…...

JVM关键指标监控(调优)

JVM 99%情况下不需要调优 使用性能更好的垃圾回收器 核心指标 针对单台服务器而言&#xff1a; jvm.gc.time: 每分钟GC耗时在1s以内 500ms以内最佳 jvm.gc.meantime: 每次YGC耗时在100ms以内&#xff0c;50ms以内最佳 jvm.fullgc.count: FGC(老生代垃圾回收)最多几小时1次&…...

【Proteus仿真】【Arduino单片机】LCD1602-IIC液晶显示

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真Arduino单片机控制器&#xff0c;使用PCF8574、LCD1602液晶等。 主要功能&#xff1a; 系统运行后&#xff0c;LCD1602液晶显示各种效果。 二、软件设计 /* 作者&#xff1a;嗨小…...

skynet学习笔记03— 服务

01、API newservice(name, ...)&#xff1a; 阻塞的形势启动一个名为 name 的新服务&#xff0c;待start函数执行完后会返回这个服务的地址。uniqueservice(name, ...)&#xff1a;针对于当前节点&#xff0c;启动一个唯一服务&#xff08;相当于单例&#xff09;&#xff0c;…...

34 Feign最佳实践

2.4.2.抽取方式 将Feign的Client抽取为独立模块&#xff0c;并且把接口有关的POJO、默认的Feign配置都放到这个模块中&#xff0c;提供给所有消费者使用。 例如&#xff0c;将UserClient、User、Feign的默认配置都抽取到一个feign-api包中&#xff0c;所有微服务引用该依赖包…...

软文推广中如何搭建媒体矩阵

媒体矩阵简单理解就是在不同的媒体平台上&#xff0c;根据运营目标和需求&#xff0c;建立起全面系统的媒体布局&#xff0c;进行多平台同步运营。接下来媒介盒子就来和大家聊聊&#xff0c;企业在软文推广过程中为什么需要搭建媒体矩阵&#xff0c;又该如何搭建媒体矩阵。 一、…...

Unity地面交互效果——5、角色足迹的制作

大家好&#xff0c;我是阿赵。   之前几篇文章&#xff0c;已经介绍了地面交互的轨迹做法。包括了法线、曲面细分还有顶点偏移。Shader方面的内容已经说完了&#xff0c;不过之前都是用一个球来模拟轨迹&#xff0c;这次来介绍一下&#xff0c;怎样和角色动作结合&#xff0c…...

Centos8安装出错问题

科普介绍&#xff1a; CentOS 8 是一个基于 Linux 的操作系统&#xff0c;是 Red Hat Enterprise Linux &#xff08;RHEL&#xff09;的免费和开源版本。它提供了稳定、安全和可靠的基础设施&#xff0c;适用于服务器和桌面环境。CentOS 8 是 CentOS 系列中最新的版本&#x…...

计算机网络技术

深入浅出计算机网络 微课视频_哔哩哔哩_bilibili 第一章概述 1.1 信息时代的计算机网络 1. 计算机网络各类应用 2. 计算机网络带来的负面问题 3. 我国互联网发展情况 1.2 因特网概述 1. 网络、互连网&#xff08;互联网&#xff09;与因特网的区别与关系 如图所示&#xff0…...

当电脑桌面黑屏,而你只有一个鼠标该怎么办(重启方法的平替)

作为一个打工人 电脑是不是黑屏简直是routine了 我们都知道重启能解决一切问题 但是&#xff01;&#xff01; 如果你只有一个鼠标 电脑因为种种原因没法重启 该怎么办呢&#xff1f; 别慌 下面的方法非常灵验 1.按住ctrlShiftEsc 调出任务管理器;此项为必须&#xf…...

Leetcode2833. 距离原点最远的点

Every day a Leetcode 题目来源&#xff1a;2833. 距离原点最远的点 解法1&#xff1a;贪心 要使得到达的距离原点最远的点&#xff0c;就看 left 和 right 谁大&#xff0c;将 left 和 right 作为矢量相加&#xff0c;再往同方向加上 underline。 答案即为 abs(left - rig…...

chrome 的vue3的开发者devtool不起作用

问题&#xff1a; 刚刚vue2升级到vue3&#xff0c;旧的devtool识别不了vue3数据。 原因&#xff1a; devtool版本过低。升级到最新。 解决&#xff1a; 去github下载vuetool项目代码&#xff1a; GitHub - vuejs/devtools: ⚙️ Browser devtools extension for debugging…...

Redis数据结构七之listpack和quicklist

本文首发于公众号&#xff1a;Hunter后端 原文链接&#xff1a;Redis数据结构七之listpack和quicklist 本篇笔记介绍 listpack 和 quicklist 两种结构 按照顺序&#xff0c;本来应该先介绍 quicklist 的结构&#xff0c;quicklist 在 7.0 之前的版本是由双向链表和压缩列表构成…...

单词规律问题

给定一种规律 pattern 和一个字符串 s &#xff0c;判断 s 是否遵循相同的规律。 这里的 遵循 指完全匹配&#xff0c;例如&#xff0c; pattern 里的每个字母和字符串 s 中的每个非空单词之间存在着双向连接的对应规律。 示例1: 输入: pattern “abba”, s “dog cat cat d…...

Windows下10分钟搞定Deeplearning4j环境配置(含阿里云镜像加速)

Windows下10分钟搞定Deeplearning4j环境配置&#xff08;含阿里云镜像加速&#xff09; Java生态下的深度学习框架Deeplearning4j&#xff08;DL4J&#xff09;为开发者提供了强大的工具支持&#xff0c;但在国内Windows环境下配置时&#xff0c;往往会遇到依赖下载缓慢、环境变…...

空间数据分析:热点区域识别与分布模式分析

空间数据分析&#xff1a;热点区域识别与分布模式分析 在当今大数据时代&#xff0c;空间数据分析已成为城市规划、环境监测、公共卫生等领域的重要工具。通过识别热点区域和分析分布模式&#xff0c;我们可以揭示隐藏的空间规律&#xff0c;为决策提供科学依据。无论是城市犯…...

FinBERT金融情感分析:如何用AI模型洞察市场情绪变化

FinBERT金融情感分析&#xff1a;如何用AI模型洞察市场情绪变化 【免费下载链接】finbert 项目地址: https://ai.gitcode.com/hf_mirrors/ai-gitcode/finbert FinBERT是一款专门为金融文本设计的预训练NLP模型&#xff0c;能够准确分析财经新闻、研报和社交媒体中的情感…...

外星人推高性价比QD - OLED显示器AW2726DM,349.99美元让更多人体验OLED优势

外星人推低价QD - OLED显示器&#xff0c;27英寸240Hz高刷来袭外星人宣布推出AW2726DM QD - OLED显示器&#xff0c;采用27英寸QHD面板&#xff0c;分辨率2560 x 1440&#xff0c;支持HDR&#xff0c;刷新率高达240Hz。其最大亮点在于价格亲民&#xff0c;在戴尔官网售价仅349.…...

【RAG】【vector_stores047】Lantern向量存储索引示例

案例目标本案例演示如何使用PostgreSQL数据库和Lantern扩展与LlamaIndex框架结合&#xff0c;实现高效的向量搜索和混合搜索功能。主要目标包括&#xff1a;展示如何创建基于Lantern的向量索引演示如何使用HNSW索引参数优化搜索性能展示如何实现混合搜索&#xff08;向量搜索全…...

在DEBUG环境通过AX、BX 寄存器操作命令理解ALU、ACC的运算逻辑

DEBUG环境下 AX、BX 寄存器操作命令&#xff08;完整版&#xff09;12 在DEBUG环境通过AX、BX 寄存器操作命令理解ALU、ACC的运算逻辑 说明&#xff1a;DEBUG是DOS系统下的调试工具&#xff0c;可直接操作CPU内部寄存器&#xff08;含AX、BX&#xff09;&#xff0c;以下命令…...

如何用genshin-wish-export快速导出原神抽卡记录:完整免费指南

如何用genshin-wish-export快速导出原神抽卡记录&#xff1a;完整免费指南 【免费下载链接】genshin-wish-export Easily export the Genshin Impact wish record. 项目地址: https://gitcode.com/GitHub_Trending/ge/genshin-wish-export 你是否曾为原神抽卡记录无法导…...

别再到处找免费股票数据了!实测可用:Python/JS/Java调用StockAPI获取K线、Level2实时行情保姆级教程

实战指南&#xff1a;用StockAPI高效获取股票数据的多语言解决方案 在金融科技和量化交易领域&#xff0c;获取准确、实时的股票数据是每个开发者面临的第一个挑战。市面上充斥着各种号称"免费"的数据源&#xff0c;但真正稳定可用的却寥寥无几。StockAPI.com.cn作为…...

避障黑科技盘点:ToF传感器 vs 超声波 vs 激光雷达,你的无人机该选哪种?

无人机避障技术终极对决&#xff1a;ToF、超声波与激光雷达实战测评 当你在狭窄的巷道上空飞行&#xff0c;或是穿越茂密的树林时&#xff0c;无人机的避障能力直接决定了它能否安全返航。市面上主流的三种避障技术——ToF传感器、超声波和激光雷达&#xff0c;各有千秋却又让普…...

相机照片详细参数怎么修改?4款工具,新手零失误

拍好的照片参数不对真的很糟心&#xff01;要么光圈显示错了&#xff0c;要么ISO、焦距乱标&#xff0c;相机型号还可能被搞错。想改却找不到简单的工具&#xff0c;要么软件太复杂&#xff0c;要么改完参数不生效&#xff0c;甚至把原图画质搞坏了。其实用对工具超简单&#x…...