算法打卡:第九章 动态规划part08

devtools/2025/1/16 13:11:23/

今日收获:买卖股票的最佳时机,买卖股票的最佳时机Ⅱ,买卖股票的最佳时机Ⅲ

1. 买卖股票的最佳时机

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

思路:

(1)二维dp数组表示第 i 天不持有股票和持有股票的状态

(2)数组初始化:第0天持有股票要花钱,不持有股票就是0

(3)遍历顺序:每一天的状态都和前一天的状态相关,所以是从左到右遍历

(4)递推公式:如果当前持有股票,则可能前一天也持有股票,也可能前一天没有股票但是当前买入股票(只能进行一次买卖所以没有资本积累,直接是-prices[i]);如果当前没有股票,有可能前一天也没有股票或者当前持有股票再卖出。

方法:

java">class Solution {public int maxProfit(int[] prices) {int len=prices.length;// 第 i 天不持有股票和持有股票的状态int[][] dp=new int[len][2];dp[0][0]=0;dp[0][1]=-prices[0];for (int i=1;i<len;i++){// 不持有股票dp[i][0]=Math.max(dp[i-1][0],dp[i-1][1]+prices[i]);// 持有股票dp[i][1]=Math.max(dp[i-1][1],-prices[i]);}return dp[len-1][0];}
}

2. 买卖股票的最佳时机Ⅱ

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

思路:和只能进行一次买卖股票的思路相同,只是递推公式不一样,在买股票时允许使用前一天没有股票时的利润。

方法:

java">class Solution {public int maxProfit(int[] prices) {int len=prices.length;int[][] dp=new int[len][2];dp[0][0]=0;dp[0][1]=-prices[0];for (int i=1;i<len;i++){dp[i][0]=Math.max(dp[i-1][0],dp[i-1][1]+prices[i]);dp[i][1]=Math.max(dp[i-1][1],dp[i-1][0]-prices[i]);}return dp[len-1][0];}
}

3. 买卖股票的最佳时机Ⅲ

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

思路:

(1)题目中说最多有两次交易,则可以不交易,交易一次或交易两次。

(2)dp数组的状态一共有4种,分为第一次持有,第一次不持有,第二次持有和第二次不持有。(3)递推公式的推导和前面两题类似,本题除了第一次持有股票中当天买入的情况之外,其他状态都是根据前一天状态推导出来的。

方法:

java">class Solution {public int maxProfit(int[] prices) {int len=prices.length;// 4种状态,0第一次持有,1第一次不持有,2第二次持有,3第二次不持有int[][] dp=new int[len][4];dp[0][0]=-prices[0];dp[0][2]=-prices[0];  // 最多两次买入for (int i=1;i<len;i++){dp[i][0]=Math.max(dp[i-1][0],-prices[i]);dp[i][1]=Math.max(dp[i-1][1],dp[i-1][0]+prices[i]);dp[i][2]=Math.max(dp[i-1][2],dp[i-1][1]-prices[i]);dp[i][3]=Math.max(dp[i-1][3],dp[i-1][2]+prices[i]);}return dp[len-1][3];}
}

http://www.ppmy.cn/devtools/109821.html

相关文章

2025年【云计算】相关技术论文题目参考,50个,总有一个是你需要的

当然&#xff0c;以下是按照您提供的格式“基于xxx的xxx系统的xxx&#xff08;开发或者实现&#xff09;”构建的论文题目&#xff0c;每个技术领域各50个&#xff1a; 云计算 基于云计算的分布式数据库系统的开发基于云计算的在线教育平台的实现基于云计算的医疗影像存储系统…

C语言关键字之extern

在 C 语言中&#xff0c;extern关键字用于声明一个变量或函数是在其他文件中定义的。它告诉编译器该变量或函数的定义在另一个源文件或模块中&#xff0c;允许跨文件访问。extern 关键字用法如下。 1. extern 用于变量的声明 当在一个源文件中定义一个全局变量&#xff0c;想在…

组合模式composite

学习笔记&#xff0c;原文链接 https://refactoringguru.cn/design-patterns/composite 将对象组合成树状结构&#xff0c; 并且能像使用独立对象一样使用它们。组合最主要的功能是在整个树状结构上递归调用方法并对结果进行汇总。 可以把各种形状组合到一个CompoundShape类中…

活动系统开发之采用设计模式与非设计模式的区别-设计模式

1、父类Base.php <?php /*** 初始化控制器* User: Administrator* Date: 2022/9/26* Time: 18:00*/ declare (strict_types 1); namespace app\controller; use app\model\common\Token; use app\BaseController; use app\BaseError; use OpenSSL\Encrypt; use app\model…

【Nginx】反向代理原理

一、正向代理 说到反向代理&#xff0c;那也不得不提一下正向代理。 什么是正向代理&#xff1f; 正向代理是一种代理模式&#xff0c;它通常位于客户端&#xff0c;允许客户端通过它来发起请求到真正的目标服务器&#xff0c;从而隐藏客户端的身份或改善性能。 举个栗子&…

音乐网站-前后台登录注册搜索试听下载评论音乐分计算机毕业设计/springboot/javaWEB/J2EE/MYSQL数据库/vue前后分离小程序

1. 前台功能模块 首页&#xff1a; 展示热门音乐、推荐音乐、最新发布。搜索框&#xff1a;支持音乐、专辑、艺人等的搜索。用户登录/注册入口。 用户注册和登录&#xff1a; 用户注册&#xff1a;输入用户名、密码、邮箱等信息。用户登录&#xff1a;输入用户名和密码。密码找…

数据分析-16-时间序列分析的常用模型

1 什么是时间序列 时间序列是一组按时间顺序排列的数据点的集合,通常以固定的时间间隔进行观测。这些数据点可以是按小时、天、月甚至年进行采样的。时间序列在许多领域中都有广泛应用,例如金融、经济学、气象学和工程等。 时间序列的分析可以帮助我们理解和预测未来的趋势和…

20240910软考架构-------软考146-150答案解析

每日打卡题146-150答案 146、【2018年真题】 难度&#xff1a;一般 给定关系R(A,B,C,D,E)与S(A,B,C,F,G)&#xff0c;那么与表达式等价的SQL语句如下&#xff1a;select &#xff08;1&#xff09; from R, S where &#xff08;2&#xff09; 。 &#xff08;1&#xff09;A.…