代码随想录算法训练营Day46|动态规划:121.买卖股票的最佳时机I、122.买卖股票的最佳时机II、123.买卖股票的最佳时机III

ADS使用Smith圆图进行阻抗匹配 在处理RF系统的实际应用问题时,总会遇到一些非常困难的工作,对各部分级联电路的不同阻抗进行匹配就是其中之一。一般情况下,需要进行匹配的电路包括天线与低噪声放大器(LNA)之间的匹配、功率放大器输出(RFOUT)与天线之间的匹配、LNA/VCO输出与混频器输入之间的匹配。匹配的目的是为了保证信号或能量有效地从“信号源”传送到“负载”。 阻抗匹配(impedance matching) 信号源内阻与所接传输线的特性阻抗大小相等且相位相同,或传输线的特性阻抗与所接负载阻抗的大小相等且相位相同,分别称为传输线的输 阅读详情

买卖股票的最佳时机I

121. 买卖股票的最佳时机 - 力扣(LeetCode)

之前用贪心算法做过相同的题,这次考虑使用动态规划来完成。

dp[i]表示前i天的最大利润

我们已知每一天的价格price[i],则dp[i]为每一天的价格price[i]减去当初购买的价格buyprice与dp1[i-1]的较大值。 dp[i] = max(dp[i-1],price[i]-buyprice)。

dp[0]表示收益为0

从前往后递推,注意要更新buyprice的价格为当前遍历过的数据中最小的值。

最后返回dp[price.size()-1]。

其实和贪心差不多,或者说贪心是这里动态规划的变体?

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        // 如果价格数组为空,则没有利润,返回0
        if(prices.size()==0)
            return 0;
        
        // 初始化买入价格为第一天的价格
        int buyprice = prices[0];
        
        // 创建一个动态数组dp,用于存储到第i天为止的最大利润
        // 初始化dp[0]为0,因为第一天买入卖出没有利润
        vector<int>dp(prices.size(),0);
        dp[0]  = 0;
        
        // 遍历价格数组,从第二天开始
        for(int i = 1;i < prices.size();i++){
            // 更新买入价格为当前价格和之前最低价格中的较小值
            buyprice = min(buyprice,prices[i]);
            // 计算如果在今天卖出股票能获得的最大利润
            // 即取当前价格减去最低买入价格和前一天的最大利润中的较大值
            dp[i] = max(dp[i-1],prices[i]-buyprice);
        }
        
        // 返回最后一天的最大利润,即整个期间的最大利润
        return dp[prices.size()-1];
    }
};

算法的时间复杂度为O(n),遍历一次数组,空间复杂度同样为O(n),需要维护一个dp数组。

买卖股票的最佳时机II

122. 买卖股票的最佳时机 II - 力扣(LeetCode)

由于不能同时参与多笔交易,则每天结束,只会存在拥有一支股票和无股票两种情况,由次,创建一个二维的dp数组(n*2的大小),其中dp[i][0]表示当天结束时,手头没有股票的最大利润,dp[i][1]表示当天结束时手头有股票的利润。

考虑推导,手头没有股票有两种情况,一是前一天就没有股票且今天没买,二是前一天有股票,但今天卖了,则dp[i][0] = max(dp[i-1][0],dp[i-1][1]+price[i]),手头有股票同样有两种情况,一是前一天没有股票但今天买了,二是昨天的股票没卖。

dp[i][1] = max(dp[i-1][0] - price[i],dp[i-1][1])

考虑到这样的情况,需对dp[0][0]和dp[1][0]初始化,dp[0][0] = 0,dp[0][1]=-price[0]

从前往后遍历(本质上还是从天来推导)

最后一天由于dp[i][0]一定大于dp[i][1],返回dp[i][0]即可。

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        // 创建一个二维数组dp,行数为prices的大小,列数为2
        // dp[i][0]代表第i天结束时,不持有股票的最大利润
        // dp[i][1]代表第i天结束时,持有股票的最大利润
        vector<vector<int>> dp(prices.size(), vector<int>(2, 0));

        // 初始化dp数组的第一行
        // 第一天不持有股票的最大利润为0
        dp[0][0] = 0; 
        // 第一天持有股票的最大利润为负的第一天价格(即买入股票)
        dp[0][1] = -prices[0];

        // 遍历价格数组,从第二天开始更新dp数组
        for(int i = 1; i < prices.size(); i++){
            // 更新第i天不持有股票的最大利润
            // 可以是前一天就不持有股票,或者前一天持有股票但今天卖出
            dp[i][0] = max(dp[i-1][0], dp[i-1][1] + prices[i]);
            // 更新第i天持有股票的最大利润
            // 可以是前一天就持有股票,或者前一天不持有股票但今天买入
            dp[i][1] = max(dp[i-1][0] - prices[i], dp[i-1][1]);
        }

        // 返回最后一天不持有股票的最大利润
        return dp[prices.size()-1][0];
    }
};

算法的时间复杂度为O(n),空间复杂度为O(n)。

买卖股票的最佳时机III

123. 买卖股票的最佳时机 III - 力扣(LeetCode)

每天结束后,我们手中持有的股票有以下五种情况。

  1. 无操作
  2. 第一次买操作
  3. 完成一笔操作
  4. 第二次买操作
  5. 完全两笔交易

由此,我们根据买卖股票的最佳时机II相似的方式,来完成本题。

  • dp[i][0]:没有进行任何交易时的利润。

  • dp[i][1]:进行了第一次买入后的利润。

  • dp[i][2]:完成了第一次卖出后的利润。

  • dp[i][3]:进行了第二次买入后的利润。

  • dp[i][4]:完成了第二次卖出后的利润。

dp[i][0]始终为0,这里我们将dp[i][0] = do[i-1][0];

dp[i][1] = max(dp[i-1][1],dp[i-1][0] - prices[i])

dp[i][2] = max(dp[i-1][2],dp[i-1][1] + prices[i])

dp[i][3] = max(dp[i-1][3],dp[i-1][2] - prices[i])

dp[i][4] = max(dp[i-1][4],dp[i-1][3] + prices[i])

从前向后遍历

返回dp[prices.size()-1][4]

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        if (prices.size() == 0) return 0; // 如果没有价格数据,则利润为0
        vector<vector<int>> dp(prices.size(), vector<int>(5, 0)); // 初始化dp数组

        // 初始化第一天的状态
        dp[0][1] = -prices[0]; // 第一天买入股票后的利润
        dp[0][3] = -prices[0]; // 假设k>=2,第一天买入第二次股票后的利润

        for (int i = 1; i < prices.size(); i++) { // 遍历价格数组
            // 更新第i天不进行任何交易的最大利润,这个值始终为0,因为不交易不会有利润变化
            dp[i][0] = dp[i - 1][0];

            // 更新第i天进行第一次买入后的最大利润
            dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] - prices[i]);

            // 更新第i天完成第一次卖出后的最大利润
            dp[i][2] = max(dp[i - 1][2], dp[i - 1][1] + prices[i]);

            // 更新第i天进行第二次买入后的最大利润
            dp[i][3] = max(dp[i - 1][3], dp[i - 1][2] - prices[i]);

            // 更新第i天完成第二次卖出后的最大利润
            dp[i][4] = max(dp[i - 1][4], dp[i - 1][3] + prices[i]);
        }

        // 返回最后一天完成所有交易后的最大利润
        return dp[prices.size() - 1][4];
    }
};

算法的时间复杂度为O(n),空间复杂度为O(n)。

「企业级智能体」LangChain4j Multi-Agent:角色分离 + 协同编排实战 在大部分 Java 项目里,“接入大模型Controller 收到一个 question调用大模型接口拿到 answer把结果原样丢回前端这种玩法可以叫「高配搜索框模式一个 Agent 要写 Prompt、要查数据库、还要改写文案,太忙了不同角色(创作者、编辑、审稿人)的职责混在一起,难以维护想复用其中一段能力(比如只要润色)也不方便把大任务拆成多个 “角色清晰的 Agent”,再编排它们像流水线一样协同完成任务。CreativeWriter:负责创作故事。 阅读详情

相关推荐

python数据处理(一)——如何用python实现excel功能

python如何实现excel的数据提取、指标构建,进行透视分析。

一名数据分析师 2702

【代码随想录训练营第42期 Day41打卡 - 买卖股票问题 - LeetCode 121. 买卖股票的最佳时机 122.买卖股票的最佳时机II 123.买卖股票的最佳时机III

动态规划、贪心--买卖股票问题

记得要努力变强 1410

Shader之——花草动画shader

今天 ,接到了个需求,花草的动画。谈到花草动画,立马就想到顶点动画,让顶点动起来就可以实现了。但是有个问题,所有的草都往一个方向运动,这个就麻烦了。因为在shader里没有随机这种概念,提到最多的是用一张噪声图来模拟。在网上搜索了一下,发现有更好的办法,就是用每个顶点到一个点的距离来控制动画的开始,毕竟每个顶点到同一个点的距离很少是一样的。 float dis = distance ...

baicaishisan的博客 2182

代码随想录算法训练营DAY48|C++动态规划Part9|121.买卖股票的最佳时机、122.买卖股票的最佳时机II、123.买卖股票的最佳时机III

递推公式先讨论一下。

糖炒栗子 1633

YOLO模型使用jupyterlab的方式进行预测/推理(示例)

首先相信很多使用过python的人都或多或少地了解过这个应用。是一个开源Web应用程序,可让用户创建和共享包含实时代码、公式、可视化和叙述文本的文档。用途包括:数据清理和转换、数值模拟、统计建模、等等。而Jupyter Lab则是Jupyter的下一代笔记本界面。是一个基于Web的交互式开发环境,用于Jupyter notebook、代码和数据。非常灵活,可支持数据科学、科学计算和机器学习领域的广泛工作。是可扩展和模块化的,其可编写插件来添加新组件并与现有组件相集成。

ocean00008899的博客 901

电涡流位移测量技术深度解密

电涡流位移传感器凭借非接触测量、高精度(可达纳米级)、强环境适应性(耐高温高压油污)等优势,成为工业精密位移检测的核心技术。其工作原理基于电磁感应:高频磁场在金属靶面感应涡流,通过检测线圈阻抗变化转化为位移信号。应用需注意靶材依赖性(需按实际材料标定)、安装精度及抗干扰措施。广泛应用于磁悬浮轴承、航空发动机、精密制造等领域,实现对微米级位移的可靠监测。

技术工作者 1752

代码随想录算法训练营Day35| LeetCode 121 买卖股票的最佳时机、122 买卖股票的最佳时机 II、123 买卖股票的最佳时机 III

代码随想录算法训练营第三十五天,劝人炒股天诛地灭!

修炼途中的所见所闻,所思所想。 1022

基于情感分析+聚类分析+LDA主题分析对服装产品类的消费者评论分析

本研究旨在通过对服装产品类的消费者评论进行综合分析,为企业提供更全面、更深入的市场洞察和决策支持。同时,本研究的方法和结果也可以为其他领域的消费者评论分析提供借鉴和参考。

m0_64336780的博客 2万+

代码随想录算法训练营Day35 | Leetcode121. 买卖股票的最佳时机、122.买卖股票的最佳时机II、123.买卖股票的最佳时机III

由递推公式可以看出其基础都是要从 dp[0][0] 和 dp[0][1] 推导出来,那么 dp[0][0] 表示第 0 天持有股票,此时的持有股票就一定是买入股票了,因为不可能有前一天推出来,所以 dp[0][0] -= prices[0];dp[0][1]表示第 0 天不持有股票,不持有股票那么现金就是 0,所以 dp[0][1] = 0。那么 dp[i][1] 一定是选最大的,所以 dp[i][1] = max(dp[i-1][0] - prices[i], dp[i - 1][1])。

叽里呱啦大王的博客 995

基于深度学习的工业零件缺陷检测系统

工业零件缺陷检测系统摘要 本文介绍了一个基于深度学习的工业零件缺陷检测系统解决方案。该系统采用Faster R-CNN目标检测算法,结合PyTorch框架和OpenCV图像处理库,实现了对工业零件表面缺陷(如裂纹、划痕、凹坑等)的自动检测与定位。系统包含完整的开发流程:从数据采集与标注、数据增强预处理、模型构建与训练,到最终的评估与部署。相比传统机器视觉方法,该深度学习方案具有更强的特征表示能力和环境适应性,能够有效提升工业质检的准确率和效率。文章详细阐述了系统架构设计、实现细节和优化策略,并提供了完整的代

huanghm88的专栏 286

linux驱动由浅入深系列:基于高通平台分析触摸屏(TP)、虚拟按键驱动

触摸屏的触摸板(touch panel简称TP)驱动的基本架构和普通按键驱动基本一致,可以参考文章:linux驱动由浅入深系列:输入子系统之二(编写一个gpio_key驱动)。只是其功能稍稍复杂些,配置也多些,下面一起来看一下。 TP包括 触摸屏、虚拟按键、虚拟按键背光灯 TP驱动芯片厂商主要有:Goodix(汇顶),FocalTech(敦泰科技),cypress(赛普拉斯),synapt

Radia的专栏 4766

代码随想录算法训练营Day45 | 121. 买卖股票的最佳时机、122.买卖股票的最佳时机II、123.买卖股票的最佳时机III

训练营第45天:121. 买卖股票的最佳时机、122.买卖股票的最佳时机II、123.买卖股票的最佳时机III

jiabao0520的博客 1346

【ComfyUI】FluxKontext 人物服装平铺重构

本文介绍了一个基于ComfyUI的高保真服装语义提取工作流,利用FluxKontext模型实现人物服装结构的精准抽离与平铺展示。工作流包含图像输入、潜空间处理、语义引导和生成输出四个阶段,通过Flux_Kontext_dev_fp8主模型、双CLIP文本编码和VAE转换等核心组件,配合FluxKontextImageScale、ReferenceLatent等节点完成服装结构的稳定提取。流程中CLIPTextEncode负责语义解析,FluxGuidance强化引导力度,KSampler执行最终生成,最终输

Mr数据杨 955

Studying-代码随想录训练营day41| 121.买卖股票的最佳时机、122.买卖股票的最佳时机II、123.买卖股票的最佳时机III

121.买卖股票的最佳时机、122.买卖股票的最佳时机II、123.买卖股票的最佳时机III

yachihaoteng的博客 1229

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

二刷代码随想录训练营Day 41|力扣121. 买卖股票的最佳时机、122.买卖股票的最佳时机II、123.买卖股票的最佳时机III

note:dp数组的含义:dp[i][0]表示当天持有股票的最大利润;dp[i][1]表示当天不持有股票的最大利润递推公式:dp[i][0] = max(dp[i -1][0 ],dp[i - 1][1]) 第i天持有股票,有两种可能,一种是前一天就已经是持有股票的状态了,第i天只是去保持这种状态;另一种是,当天才去购买股票,由于题上说只能购买一支股票,因此直接在0的基础上-prices[i]

weixin_64434454的博客 1038

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

代码随想录算法训练营Day35 | 121.买卖股票的最佳时机、122.买卖股票的最佳时机II、123.买卖股票的最佳时机III

3. 递推公式的基础是 dp[0][0] 和 dp[0][1],dp[0][0] 表示第 0 天购入股票的情况,所以 dp[0][0] = -prices[0],dp[0][1] 表示第 0 天不持有股票的情况,第 0 天不持股,所以 dp[0][1] = 0;2. dp[i][1]:第 i 天没有操作,沿用前一天买入的状态,即 dp[i - 1][1];dp[i][1]:前几天就卖出了,第 i-1 天不持有股票,就保持现状 dp[i-1][1];3. 第 0 天没有操作,所以 dp[0][0] = 0;

2401_86818319的博客 598

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

代码随想录算法训练营第41天|121. 买卖股票的最佳时机、122.买卖股票的最佳时机II、123.买卖股票的最佳时机III

dp[i][0]:持有股票有两种情况,一种是股票在之前买入,那么则为dp[i - 1][0];dp[i][1]:不持有股票的两种情况,一种是之前就卖掉了,则为dp[i-1][1];dp[i][0]:持有股票有两种情况,一种是股票在之前买入,那么则为dp[i - 1][0];dp[i][1]:不持有股票的两种情况,一种是之前就卖掉了,则为dp[i-1][1];dp[i][0]表示第一次持有股票,dp[i][1]表示第一次不持有,dp[i][2]表示第二次持有,dp[i][3]表示第二次不持有。

Yinems的博客 738

day40 代码随想录算法训练营 动态规划专题8

dp专题8:买卖股票的最佳时机Ⅰ、Ⅱ、Ⅲ

I_CLK的博客 1221

代码随想录训练营 Day41打卡 动态规划 part08 121. 买卖股票的最佳时机 122. 买卖股票的最佳时机II 123. 买卖股票的最佳时机III

代码随想录训练营 Day40打卡 动态规划 part08 121. 买卖股票的最佳时机 122. 买卖股票的最佳时机II 123. 买卖股票的最佳时机III

qq_42952637的博客 926

day41 | 121. 买卖股票的最佳时机 122.买卖股票的最佳时机II 123.买卖股票的最佳时机III

*注意:**你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回。在每一天,你可以决定是否购买和/或出售股票。设计一个算法来计算你所能获取的最大利润。设计一个算法来计算你所能获取的最大利润。你也可以先购买,然后在。个元素是一支给定的股票在第。买入这只股票,并选择在。给定一个数组,它的第。

m0_65709641的博客 450

代码随想录算法训练营第 41 天 | LeetCode121. 买卖股票的最佳时机 LeetCode122. 买卖股票的最佳时机ii LeetCode123. 买卖股票的最佳时机iii

视频讲解。

2301_79647020的博客 453

代码随想录算法训练营Day39 | 121. 买卖股票的最佳时机、122.买卖股票的最佳时机II、123.买卖股票的最佳时机III

代码随想录算法训练营Day39 | 121. 买卖股票的最佳时机、122.买卖股票的最佳时机II、123.买卖股票的最佳时机III

Harryline的博客 460

代码训练营 day45|LeetCode121,LeetCode122,LeetCode123

今天主要学习了dp的一系列操作,今天最后一题稍微难点。加油,坚持打卡的第45天。

qq_44639909的博客 908

代码随想录算法训练营day41 | 121. 买卖股票的最佳时机、122.买卖股票的最佳时机II 、123.买卖股票的最佳时机III

碎碎念:头好痒 要长脑子了。

weixin_45182267的博客 432

代码随想录算法训练营第三十九天 | 122.买卖股票的最佳时机II | 123.买卖股票的最佳时机III | 188.买卖股票的最佳时机IV | 309.最佳买卖股票时机含冷冻期

买卖股票之一次买卖:贪心: 左边最小值, 右边最大值, 得到最大差值dp: 今天持有股票, 今天未持有股票(不能卖了再买)买卖股票之多次买卖:dp: 今天持有股票, 今天未持有股票(买了再卖)买卖股票之k次买卖:dp: 第k次买入, 第k次卖出买卖之冷冻期:dp: 冷冻期如何表示, 可以以具体状态表示, 可以隐含的表示(昨天卖了今天就是冷冻期)

Noah_aa的博客 725

【代码随想录】【算法训练营】【第46天】 [121]买卖股票的最佳时机 [122]买卖股票的最佳时机II [123]买卖股票的最佳时机III

思路及算法思维,指路。题目来自。day 46,周六,坚持很困难~

day day up 441
上一篇: 代码随想录算法训练营Day45|198.打家劫舍I、213.打家劫舍II、337.打家劫舍III
下一篇: 代码随想录算法训练营Day48|188.买卖股票的最佳时机IV、309.最佳买卖股票时间含冷冻期、714.买卖股票的最佳时机含手续费
viaNoir
博客等级 码龄10年 535粉丝 59原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值