代码随想录Day49|121.买卖股票的最佳时期、122.买卖股票的最佳时期II

news2024/11/25 16:40:59

文章目录

  • 121.买卖股票的最佳时期、
  • 122.买卖股票的最佳时期II

121.买卖股票的最佳时期、

文章讲解:代码随想录 (programmercarl.com)

题目链接:121. 买卖股票的最佳时机 - 力扣(LeetCode)

题目:

给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。

你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。

返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。

分析:

  1. 确定dp数组(dp table)以及下标的含义

    dp[i] [0] 表示第i天持有股票所得最多现金 ,这里可能有同学疑惑,本题中只能买卖一次,持有股票之后哪还有现金呢?

    其实一开始现金是0,那么加入第i天买入股票现金就是 -prices[i], 这是一个负数。

    dp[i] [1] 表示第i天不持有股票所得最多现金

    注意这里说的是“持有”,“持有”不代表就是当天“买入”!也有可能是昨天就买入了,今天保持持有的状态

  2. 确定递推公式

    如果第i天持有股票即dp[i] [0], 那么可以由两个状态推出来

    • 第i-1天就持有股票,那么就保持现状,所得现金就是昨天持有股票的所得现金 即:dp[i - 1] [0]
    • 第i天买入股票,所得现金就是买入今天的股票后所得现金即:-prices[i]

    那么dp[i] [0]应该选所得现金最大的,所以dp[i] [0] = max(dp[i - 1] [0], -prices[i]);

    如果第i天不持有股票即dp[i] [1], 也可以由两个状态推出来

    • 第i-1天就不持有股票,那么就保持现状,所得现金就是昨天不持有股票的所得现金 即:dp[i - 1] [1]
    • 第i天卖出股票,所得现金就是按照今天股票佳价格卖出后所得现金即:prices[i] + dp[i - 1] [0]

    同样dp[i] [1]取最大的,dp[i] [1] = max(dp[i - 1] [1], prices[i] + dp[i - 1] [0]);

  3. dp数组如何初始化

    由递推公式 dp[i] [0] = max(dp[i - 1] [0], -prices[i]); 和 dp[i] [1] = max(dp[i - 1] [1], prices[i] + dp[i - 1] [0]);可以看出

    其基础都是要从dp[0] [0]和dp[0] [1]推导出来。

    那么dp[0] [0]表示第0天持有股票,此时的持有股票就一定是买入股票了,因为不可能有前一天推出来,所以dp[0] [0] -= prices[0];

    dp[0] [1]表示第0天不持有股票,不持有股票那么现金就是0,所以dp[0] [1] = 0;

  4. 确定遍历顺序

    从递推公式可以看出dp[i]都是有dp[i - 1]推导出来的,那么一定是从前向后遍历。

  5. 举例推导dp数组

    121.买卖股票的最佳时机

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int len = prices.size();
        if (len == 0) return 0;
        vector<vector<int>> dp(len, vector<int>(2));
        dp[0][0] -= prices[0];
        dp[0][1] = 0;
        for (int i = 1; i < len; i++) {
            dp[i][0] = max(dp[i - 1][0], -prices[i]);
            dp[i][1] = max(dp[i - 1][1], prices[i] + dp[i - 1][0]);
        }
        return dp[len - 1][1];
    }
};

122.买卖股票的最佳时期II

文章讲解:代码随想录 (programmercarl.com)

题目链接:122. 买卖股票的最佳时机 II - 力扣(LeetCode)

题目:

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

设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。

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

分析:

这里重申一下dp数组的含义:

  • dp[i] [0] 表示第i天持有股票所得现金。
  • dp[i] [1] 表示第i天不持有股票所得最多现金

如果第i天持有股票即dp[i] [0], 那么可以由两个状态推出来

  • 第i-1天就持有股票,那么就保持现状,所得现金就是昨天持有股票的所得现金 即:dp[i - 1] [0]
  • 第i天买入股票,所得现金就是昨天不持有股票的所得现金减去 今天的股票价格 即:dp[i - 1] [1] - prices[i]

注意这里和121. 买卖股票的最佳时机 (opens new window)唯一不同的地方,就是推导dp[i][0]的时候,第i天买入股票的情况

在121. 买卖股票的最佳时机 (opens new window)中,因为股票全程只能买卖一次,所以如果买入股票,那么第i天持有股票即dp[i] [0]一定就是 -prices[i]。

而本题,因为一只股票可以买卖多次,所以当第i天买入股票的时候,所持有的现金可能有之前买卖过的利润。

那么第i天持有股票即dp[i] [0],如果是第i天买入股票,所得现金就是昨天不持有股票的所得现金 减去 今天的股票价格 即:dp[i - 1] [1] - prices[i]。

在来看看如果第i天不持有股票即dp[i] [1]的情况, 依然可以由两个状态推出来

  • 第i-1天就不持有股票,那么就保持现状,所得现金就是昨天不持有股票的所得现金 即:dp[i - 1] [1]
  • 第i天卖出股票,所得现金就是按照今天股票佳价格卖出后所得现金即:prices[i] + dp[i - 1] [0]
class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int len = prices.size();
        vector<vector<int>> dp(len, vector<int>(2, 0));
        dp[0][0] -= prices[0];
        dp[0][1] = 0;
        for (int i = 1; i < len; i++) {
            dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] - prices[i]); // 注意这里是和121. 买卖股票的最佳时机唯一不同的地方。
            dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] + prices[i]);
        }
        return dp[len - 1][1];
    }
};

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

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

相关文章

Metal每日分享,调整灰度系数gamma滤镜效果

本案例的目的是理解如何用Metal实现灰度系数效果滤镜&#xff0c;输入像素rgb进行次方运算获取到新的rgb&#xff1b; Demo HarbethDemo地址 实操代码 // 灰度系数滤镜 let filter C7Gamma.init(gamma: 3.0)// 方案1: ImageView.image try? BoxxIO(element: originImage,…

[附源码]Node.js计算机毕业设计儿童闲置物品交易网站Express

项目运行 环境配置&#xff1a; Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境&#xff1a;最好是Nodejs最新版&#xff0c;我…

六、JavaScript——变量的内存结构

一、内存 定义&#xff1a;内存是用于存储数据的地方&#xff0c;程序要执行一段代码&#xff0c;要先从硬盘加载到内存当中&#xff0c;再由内存发送给CPU,CUP才能对代码进行执行。 注&#xff1a;变量并不存储任何值&#xff0c;而是存储值的内存地址 JS定义一个变量 <s…

Telerik模拟生成规则的新设置

Telerik模拟生成规则的新设置 添加了对Microsoft.NET 7官方版本的支持。 添加了控制模拟生成规则的设置。 Telerik JustLock是一个易于使用的模拟工具&#xff0c;它将帮助您以前所未有的速度、更高的质量编写单元测试。JustLock允许您轻松地将测试场景与难以配置的依赖关系(如…

5G现场网的数字孪生体系架构

现场网面向钢铁生产和统一管理的场景&#xff0c;实现现场设备与数据采集器和控制器的网络连接和数据互通&#xff0c;现场网的ZigBee、蓝牙等短距离技术以及窄带物联网&#xff08; narrowbandinternetofthings,NB-IoT&#xff09;、超远距离&#xff08;longrange,LoRa&#…

病历开发SDK:TX Text Control ActiveX 31.x Crack

Visual Basic 6 应用程序的文档处功能齐全的文档编辑器 TX Text Control ActiveX是一种完全可编程的 Rich Edit 控件&#xff0c;它在专为 Visual Studio 设计的可重用组件中为开发人员提供了广泛的文字处理功能。它提供全面的文本格式、强大的邮件合并功能和所有文字处理关键概…

算法训练四十八天 | LeetCode 198、213、337打家劫舍专题

LeetCode 198 打家劫舍 题目简析&#xff1a; 不能偷相邻的屋子&#xff0c;求能偷到的最大金额 思路分析&#xff1a; //由于是相邻的才偷&#xff0c;因此&#xff0c;我们对于最基础的三间 //dp[3] 应该是 Math.max(dp[2],dp[1]nums[3]) //如果第一间加偷第三间的价值大…

pytest + yaml 框架 -10.allure 生成报告

前言 本插件是基于pytest框架开发的&#xff0c;所以pytest 的插件都能使用&#xff0c;生成报告可以用到 allure 报告 pip 安装插件 pip install pytest-yaml-yoyoallure 报告功能在 v1.0.8 版本上实现 allure 命令行工具 allure 是一个命令行工具&#xff0c;需要去githu…

大话设计模式之设计原则

设计原则 参考链接&#xff1a;https://datawhalechina.github.io/sweetalk-design-pattern/#/content/design_principles/dependence_inversion_principle 主要介绍以下五个设计原则&#xff1a; 1、单一职责原则 顾名思义&#xff0c;一个类只有一个职责&#xff0c;只会…

React 16.8+生命周期(新)

React16之后有三个生命周期被废弃&#xff1a; componentWillMountcomponentWillReceivePropscomponentWillUpdate React 16.8的生命周期分为三个阶段&#xff0c;分别是挂载阶段、更新阶段、卸载阶段。 挂载阶段&#xff1a; constructor&#xff1a;构造函数&#xff0c;最…

【元胞自动机】基于元胞自动机模拟考虑心理策略的人员疏散附matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

2022-12-13 工作记录--Vue/JS-音乐的播放与关闭

Vue/JS-音乐的播放与关闭 一、音频资源 音频资源的位置如下&#xff1a;&#x1f447;&#x1f3fb; 二、代码 App.vue 注意点&#xff1a; 1、若切换了音频资源&#xff0c;则需要在 播放音乐前 重新加载资源——见代码里的 myAuto?.load()&#xff1b;2、若切换了页面&…

论文学习——秦淮河水文水动力模型及实时校正

文章目录摘要0 引言1 模型构建1.1 流域概况及资料收集1.2 河道一维水流模拟1.3 边界条件处理1.3.1 流量上边界计算1.3.2 水文下边界处理1.4 节点堰闸流量计算2 实时校正方法2.1 KNN 法2.2 反馈法3 模拟及校正结果4 结论作者&#xff1a;孙文宇、姚成、刘志雨 期刊&#xff1a;《…

Allegro如何编辑过孔的封装参数操作指导

Allegro如何编辑过孔的封装参数操作指导 Allegro可以快捷的编辑过孔的封装,具体操作如下 以编辑这个via的封装为例 用Candence安装目录下面的pad_designer打开过孔的pad封装 打开后的效果如下图 如果需要改成钻孔8mil的孔,只需要在Drill diameter把10改成8即可 钻孔尺寸…

一比一手写迷你版vue,彻底搞懂vue运行机制

前言 现在前端面试Vue中都会问到响应式原理以及如何实现的&#xff0c;如果你还只是简单回答通过Object.defineProperty()来劫持属性可能已经不够了。 本篇文章通过学习文档及视频教程实现手写一个简易的Vue源码实现数据双向绑定&#xff0c;解析指令等。 几种实现双向绑定的…

好物安利:老照片修复软件哪个好?

大家都知道&#xff0c;老照片承载了很多的回忆&#xff0c;还有许多见证了城市的变迁及发展。甚至可以说&#xff0c;那些老照片&#xff0c;每一张都蕴藏着一个故事&#xff0c;能还原一段历史。但这些老照片&#xff0c;或多或少因为之前的设备、或储存不当等问题&#xff0…

【Docker】Docker安装Redis,并配置数据备份同步到宿主机

专栏精选文章 《Docker是什么&#xff1f;Docker从介绍到Linux安装图文详细教程》《30条Docker常用命令图文举例总结》《Docker如何构建自己的镜像&#xff1f;从镜像构建到推送远程镜像仓库图文教程》《Docker多个容器和宿主机之间如何进行数据同步和数据共享&#xff1f;容器…

Spring:Aop

目录 一、Aop简介 AOP相关术语 二、使用AOP 一、Aop简介 AOP(Aspect Oriented Programming)面向切面编程&#xff0c;一种编程范式&#xff0c;指导开发者如何组织程序结 构 原理&#xff1a;将复杂的需求分解出不同方面&#xff0c;将散布在系统中的公共功能集中解决 …

MEE: A Novel Multilingual Event Extraction Dataset 论文解读

MEE: A Novel Multilingual Event Extraction Dataset paper&#xff1a;[2211.05955] MEE: A Novel Multilingual Event Extraction Dataset (arxiv.org) code&#xff1a;None 期刊/会议&#xff1a;EMNLP 2022 摘要 事件抽取&#xff08;EE&#xff09;是信息抽取&#…

OS_用户层的IO软件@缓冲区@磁盘高速缓存@异步IO

文章目录OS_用户层的IO软件缓冲区磁盘高速缓存异步IO用户层的IO软件&#x1f388;1.系统调用2.库函数高速缓存与缓冲区磁盘高速媛存(Disk Cache)缓冲区Buffer缓冲的用途设备速度的巨大差异&#x1f388;缓冲和缓存的比较联系区别缓冲区的结构缓冲的引入单缓冲区和双缓冲区单缓冲…