代码随想录算法训练营 ---第四十九天

前言:

    今天是买卖股票的最佳时机系列,本系列之前在学习贪心思想时做过一些。

第一题:

简介:

本题在读题时我们要注意到几个细节

1.本题股票买卖只有一次。2.我们要在最低点买股票,在最高点卖股票。

我的思路:

  dp[i]含义:在第0天到第i天的最大利益。本题我的思路是不断更新最低点,然后与前一天进行比较那天利益高,这样就保持第0天到第i天的利益。但是此思路只适用于本题目。比较好理解。

int maxProfit(vector<int>& prices) {vector<int> dp(prices.size(),0);int max1 =prices[0];for(int  i=1;i<prices.size();i++){dp[i] =max(prices[i] - max1,dp[i-1]);if(max1>prices[i]){max1 = prices[i];}}if(dp.back()<=0)return 0;return dp.back();}
题解思路: 
动规五部曲分析如下:
    1.确定dp数组以及下标的含义

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数组

以示例1,输入:[7,1,5,3,6,4]为例,dp数组状态如下:

121.买卖股票的最佳时机

dp[5][1]就是最终结果。

为什么不是dp[5][0]呢?

因为本题中不持有股票状态所得金钱一定比持有股票状态得到的多!


代码实现:

  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];}

注:我认为本题看题解思路 一定要时刻提醒自己dp二维数组的含义,否则很容易混乱。然后我们要知道,本题只需要买卖一次,所以dp[i][0]可以得到买入股票花费最少的点。dp[i][1]可以得到卖出股票利益最大的点。

第二题: 
 

简介:

本题和上一题不同的点在于本题股票可以多次买卖,没有限制。我认为第一次做的同学先去看贪心思想的解法,再来看动态规划的解法。

两题代码上唯一的不同点

此不同点出现的原因在于本题不限制股票买卖次数所以我们买入股票时手里可能有钱 。

代码实现:

贪心思想:
int maxProfit(vector<int>& prices) {int  result=0;for(int i=0;i<prices.size();i++){if(i+1 == prices.size())continue;if(prices[i+1]-prices[i]>0){result += prices[i+1]-prices[i];}}return result;}
动态规划:
我的动态规划(不知道算不算感觉有点像贪心的思想):
 int maxProfit(vector<int>& prices) {vector<int> dp(prices.size(),0);for(int i=1;i<prices.size();i++){if(prices[i]-prices[i-1]>0){dp[i] = prices[i]-prices[i-1]+dp[i-1];}else{dp[i] +=dp[i-1];}}return dp.back();}
题解: 
 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.mzph.cn/news/178995.shtml

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

相关文章

【攻防世界-misc】hong

1.下载解压文件&#xff0c;是个音频文件&#xff0c;但打不开 2.复制到kali中先拆分看音频里面有隐含文件没有 用到的命令是&#xff1a;foremost 桌面/hong.mp3 点击桌面上的主文件夹 点击“output”文件夹&#xff0c; 点击文件中的jpg文件夹&#xff0c;有两张图片&#…

uniapp使用vue3和ts开发小程序获取用户城市定位

这个组件的功能&#xff1a;可以重新定位获取到用户的具体位置&#xff0c;这个是通过getLocation这个api和高德地图的api获取到的&#xff0c;getLocation这个api需要在微信公众平台后台>开发管理> 接口管理里面申请才能使用的&#xff0c;不然无法使用哦&#xff0c;这…

大数据存储技术期中考点梳理

1.CAP理论 分布式系统的CAP理论: 首先将分布式系统中的三个特性进行如下归纳: 口(一致性(C):在分布式系统中的所有数据备份&#xff0c;在同一时刻是否有同样的值。(等于所有节点访问同一份最新的数据副本) 口可用性(A):在集群中一部分节点故障后&#xff0c;集群整体是否还能…

kafka开发环境搭建

文章目录 1 安装java环境1.1 下载linux下的安装包1.2 解压缩安装包1.3 解压后的文件移到/usr/lib目录下1.4 配置java环境变量 2 kafka的安装部署2.1 下载安装kafka2.2 配置和启动zookeeper2.3 启动和停止kafka 1 安装java环境 1.1 下载linux下的安装包 &#xff08;1&#xf…

【经验总结】网络关闭但ECU没有休眠前如何网络唤醒

目录 前言 正文 1.网络休眠时的相关系统状态 2.网络休眠后重新唤醒网络需要做的准备工作

组合模式 (Composite Pattern)

定义&#xff1a; 组合模式&#xff08;Composite Pattern&#xff09;是一种结构型设计模式&#xff0c;用于将对象组合成树形结构以表示部分-整体的层次关系。这种模式创建了一种包含单个对象和组合对象的统一接口&#xff0c;使得客户端可以以统一的方式处理单个对象和组合…

刷题记录第三十五天-(KMP算法)找出字符串中的第一个匹配项的下标

KMP算法真是刷一次忘一次 #include<bits\stdc.h> using namespace std; void get_next(vector<int>& next, string s){int j0;next[0]0;for(int i1;i<s.size();i){while(j>0&&s[i]!s[j]){jnext[j-1];}if(s[i]s[j])j;next[i]j;} } int find(strin…

第19章JAVA绘图

19.1JAVA绘图类 绘图是高级程序设计中非常重要的技术 19.1.1Graphics类 Graphics类是所有图形上下文的抽象基类&#xff0c;它允许应用程序在组件以及闭屏图片上进行绘制 Graphics类封装了JAVA支持的基本绘图操作所需的状态信息&#xff0c;主要包括颜色&#xff0c;字体&…

快速了解Spring AOP的概念及使用

文章目录 1. AOP概念1.1 什么是AOP&#xff1f;1.2 什么是Spring AOP&#xff1f; 2. Spring AOP的使用2.1 引入Spring AOP依赖2.2 编写AOP程序 3. Spring AOP详解3.1 Spring AOP核心概念1. 切点&#xff08;Pointcut&#xff09;2. 连接点&#xff08;Join Point&#xff09;3…

AI模型推理(5)——实战篇(持续更新)

前言 本文主要通过实战的方式&#xff0c;记录各种模型推理的方法 模型训练 首先我们先使用Pytorch训练一个最简单的十分类神经网络&#xff0c;如下&#xff1a; import torch from torch import nn from torch.utils.data import DataLoader from torchvision import data…

如何运用AppLink平台中的数据连接器组件

AppLink平台组件组成 AppLink平台组件分成三个板块触发事件组件、基础组件和数据连接器 数据连接器组件里面有10个组件&#xff0c;目前也在不断新增更多的数据连接器&#xff0c;那他们在AppLink平台里的原理、触发动作以及怎么使用呢&#xff1f;接下来用MySQL和TimescaleD…

在线陪诊系统: 医疗科技的崭新前沿

在医学科技的快速发展中&#xff0c;在线陪诊系统正成为医疗服务领域的创新力量。通过结合互联网和先进的远程技术&#xff0c;这一系统为患者和医生提供了更为便捷、高效的医疗体验。本文将深入探讨在线陪诊系统的技术背后的核心代码和实现原理。 技术背后的关键代码 在线陪…

用于图像分类任务的经典神经网络综述

&#x1f380;个人主页&#xff1a; https://zhangxiaoshu.blog.csdn.net &#x1f4e2;欢迎大家&#xff1a;关注&#x1f50d;点赞&#x1f44d;评论&#x1f4dd;收藏⭐️&#xff0c;如有错误敬请指正! &#x1f495;未来很长&#xff0c;值得我们全力奔赴更美好的生活&…

autojs-图片篇(一)

注释很详细&#xff0c;直接上代码 自动点击授予权限的操作 //安卓版本高于Android 9 if(device.sdkInt>28){//等待截屏权限申请并同意threads.start(function () {packageName(com.android.systemui).text(立即开始).waitFor();text(立即开始).click();}); }截图查相应位置…

开关电源做“做安规”请记住这 4 点!

1.定义 为了保证人身安全,财产,环境等不受伤害和损失,所做出的规定。 2.安规所涉及的要求 a.电击 b.火灾 c.电磁辐射 d.环境污染 e.化学辐射 f.能量冲击 g.化学腐蚀 h.机械伤害和热伤害 3.世界主要安规体系 a.IEC体系----以欧盟为代表 b.UL体系----以美国为代表…

55.跳跃游戏

原题链接&#xff1a;55.跳跃游戏 思路&#xff1a; 看代码注释 全代码&#xff1a; class Solution { public:bool canJump(vector<int>& nums) {int cover 0;if (nums.size() 1) return true; // 只有一个元素&#xff0c;就是能达到for (int i 0; i < co…

探索性因子分析流程

探索性因子分析的步骤&#xff1a; 接下来&#xff0c;通过一个案例演示因子分析&#xff08;探索性因子分析&#xff09;的各个步骤应该如何进行。 案例&#xff1a;欲探究我国不同省份铁路运输能力情况&#xff0c;收集到部分相关数据如下&#xff1a; 上传数据至SPSSAU系统…

echarts 水波图

echarts 水波图 安装 npm install echarts --save npm install echarts-liquidfill --save引入 import * as echarts from echarts; import echarts-liquidfill;html <div id"chart1" ref"chart1" class"chart1"></div>css .cha…

leetcode做题笔记1670. 设计前中后队列

请你设计一个队列&#xff0c;支持在前&#xff0c;中&#xff0c;后三个位置的 push 和 pop 操作。 请你完成 FrontMiddleBack 类&#xff1a; FrontMiddleBack() 初始化队列。void pushFront(int val) 将 val 添加到队列的 最前面 。void pushMiddle(int val) 将 val 添加到…

RequestContextHolder 类简介

RequestContextHolder 类简介 RequestContextHolder是Spring Framework中的一个类&#xff0c;用于在多线程环境中存储和访问HTTP请求的上下文信息。它允许在Spring应用程序中从任何位置访问当前请求的相关信息&#xff0c;如HTTP头部、会话数据等&#xff0c;而无需将请求对象…