LeetCode算法题解(动态规划,股票买卖)|LeetCode121. 买卖股票的最佳时机、LeetCode122. 买卖股票的最佳时机 II

news/2025/3/14 18:25:43/

一、LeetCode121. 买卖股票的最佳时机

题目链接:121. 买卖股票的最佳时机
题目描述:

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

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

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

示例 1:

输入:[7,1,5,3,6,4]
输出:5
解释:在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格;同时,你不能在买入前卖出股票。

示例 2:

输入:prices = [7,6,4,3,1]
输出:0
解释:在这种情况下, 没有交易完成, 所以最大利润为 0。

提示:

  • 1 <= prices.length <= 105
  • 0 <= prices[i] <= 104
算法分析:
定义dp数组及下标含义:

dp[i][0]表示第i天持有股票时所得的最大利润,dp[i][1]表示第i天不持有股票时所得的最大利润。

递推公式:

第i天持有股票,可以由i-1天是否持有股票两种状态推出来:

i-1天持有股票,那么保持现状,dp[i][0]=dp[i-1][0]。

i-1天不持有股票,那么在i天买入股票,dp[i][0]=-prices[i](注意买卖只有一天,所以买入股票当天的利润是-prices[i]),利润可以为负数。

所以第i天持有股票是所得的最大利润dp[i][0]=max(dp[i-1][0],-prices[i]);

第i天不持有股票,也可以由i-1天书否持有股票的两种状态推出来:

i-1天持有股票,那么在i天卖出股票,dp[i][1]=dp[i-1][0]+prices[i](卖出股票时得到的利润为持有股票时的利润加上i天的股票价格)

i-1天不持有股票,那么保持现状,dp[i][1]=dp[i-1][1]。

所以第i天不持有股票时所得的最大利润为dp[i][1]=max(dp[i-1][0]+prices[i],dp[i-1][1]);

初始化:

第零天持有股票dp[0][0]=-prices[0];

第零天不持有股票dp[0][1]=0;

遍历顺序:

从左到右依次遍历每一天都股票价格。

打印dp数组进行验证。

代码如下:

class Solution {public int maxProfit(int[] prices) {int[][] dp = new int[prices.length][2];dp[0][0] = -prices[0];dp[0][1] = 0;for(int i = 1; i < prices.length; 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]);}return dp[prices.length - 1][1];}
}

二、LeetCode122. 买卖股票的最佳时机 II

题目链接:122. 买卖股票的最佳时机 II
题目描述:

给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格。

在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在 同一天 出售。

返回 你能获得的 最大 利润 。

示例 1:

输入:prices = [7,1,5,3,6,4]
输出:7
解释:在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5 - 1 = 4 。随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6 - 3 = 3 。总利润为 4 + 3 = 7 。

示例 2:

输入:prices = [1,2,3,4,5]
输出:4
解释:在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5 - 1 = 4 。总利润为 4 。

示例 3:

输入:prices = [7,6,4,3,1]
输出:0
解释:在这种情况下, 交易无法获得正利润,所以不参与交易可以获得最大利润,最大利润为 0 。

提示:

  • 1 <= prices.length <= 3 * 104
  • 0 <= prices[i] <= 104
算法分析:
定义dp数组及下标含义:

dp[i][0]表示第i天持有股票时所得利润,dp[i][1]表示第i天不持有股票时所得最大利润。

递推公式:

第i天持有股票,可以由i-1天是否持有股票两种状态推出来:

i-1天持有股票,那么保持现状,dp[i][0]=dp[i-1][0]。

i-1天不持有股票,那么在i天买入股票,dp[i][0]=dp[i-1][1]-[prices[i](注意买卖可以有多天,所以买入股票当天的利润可能包含之前买卖过股票的利润。

所以第i天持有股票是所得的最大利润dp[i][0]=max(dp[i-1][0],-prices[i]);

第i天不持有股票,也可以由i-1天书否持有股票的两种状态推出来:

i-1天持有股票,那么在i天卖出股票,dp[i][1]=dp[i-1][0]+prices[i](卖出股票时得到的利润为持有股票时的利润加上i天的股票价格)

i-1天不持有股票,那么保持现状,dp[i][1]=dp[i-1][1]。

所以第i天不持有股票时所得的最大利润为dp[i][1]=max(dp[i-1][0]+prices[i],dp[i-1][1]);

初始化:

dp[0][0]=prices[0],第零天持有股票。

dp[0][1]=0,第零天不持有股票。

遍历顺序:

从左到右依次遍历每天的股票。

打印dp数组。

代码如下:

class Solution {public int maxProfit(int[] prices) {int[][] dp = new int[prices.length][2];dp[0][0] = -prices[0];dp[0][1] = 0;for(int i = 1; i < prices.length; 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[prices.length-1][1];}
}

总结

这两道题其实不用动态规划还好做一点。


http://www.ppmy.cn/news/1246586.html

相关文章

查看当前目录下文件数量

查看当前目录下文件数量 查看文件夹数量查看文件数查看所有文件&#xff08;包括子文件&#xff09;数量查看所有目录&#xff08;包括子目录&#xff09;数量查看图片数量 查看文件夹数量 ls -l | grep ^d | wc -l查看文件数 不包含文件夹 ls -l | grep ^- | wc -l查看所有…

Java面向对象第三天:

精华笔记&#xff1a; 引用类型数组&#xff1a; 给引用类型数组的元素赋值&#xff0c;需要new一下 若想访问对象的属性或调用方法&#xff0c;需要通过数组元素去打点 继承&#xff1a; 作用&#xff1a;代码复用 通过extends来实现继承 超类/父类&#xff1a;共有的属性…

开源编译器LLVM-源码编译

1.编译参考 详细的cmake编译选项&#xff0c;参考&#xff1a;Building LLVM with CMake — LLVM 18.0.0git documentation 2.编译脚本 utils.bash build-llvm.sh 依赖 utils.bash 脚本 #!/usr/bin/env bashCOLOR_FATAL$\033[41;38m COLOR_ERROR$\033[1;31m COLOR_WARN$\03…

k8s-deployment控制器 5

K8s控制器是Kubernetes&#xff08;简称k8s&#xff09;系统中一个重要的组成部分&#xff0c;它是一个管理Pod的中间层&#xff0c;可以创建和管理多个Pod副本&#xff0c;确保它们按照预定的数量和行为进行运行。 通过编写yaml文件将信息全部存到etcd中&#xff0c;控制器通…

iOS-打包上架构建版本一直不出现/正在处理/自动消失

iOS开发过程中&#xff0c;打包上架苹果审核是一个不可或缺的环节。说实话&#xff0c;这个问题我遇见两次了&#xff0c;为了让自己长点记性&#xff0c;决定写下来。首先&#xff0c;列举几种情况&#xff1a; 1.iPa包上传至App store后&#xff0c;一个小时内不显示构建版本…

重生奇迹MU魔法师操作技能

重生奇迹MU魔法师增加伤害加点方式 一、智力敏捷加点&#xff1a;2点智力1点敏捷&#xff0c;这种加点就是智敏结合的加点了&#xff0c;属性是不错的&#xff0c;提升了非常多的属性点&#xff0c;智力是偏重输出的&#xff0c;也是法师最常见的一种加点了&#xff0c;输出伤…

signal函数简介及使用

signal.h是C标准函数库中的信号处理部分&#xff0c;定义了程序执行时如何处理不同的信号。信号用作进程间通信&#xff0c;报告异常行为(如除零)、用户的一些按键组合(如同时按下Ctrl与C键&#xff0c;产生信号SIGINT)。C中的对应头文件是csignal。 C语言标准定义了6个信号&a…

如何通过低代码工具,提升运输行业的运营效率和服务质量

《中国数字货运发展报告》显示&#xff0c;2022年我国公路货运市场规模在5万亿元左右。其中&#xff0c;数字货运整体市场规模约为7000亿元&#xff0c;市场渗透率约为15%。而以小微企业为主的货运行业&#xff0c;却以小、散、乱的行业特征&#xff0c;承载着5万亿元左右的市场…