力扣第121题 买卖股票的最佳时机 c++ 动态规划解法 熟练dp思维 之简单题 附Java代码

题目

(在我以前有贪心解法,也可以去参考参考)

贪心解法 股票问题icon-default.png?t=N7T8https://blog.csdn.net/jgk666666/article/details/133978629

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

思路和解题方法

  1. 首先判断给定的股票价格数组的长度是否为0,如果为0,则直接返回0。
  2. 然后,代码使用循环从第二天开始遍历股票价格数组。对于第i天,有两种状态:要么持有股票,要么不持有股票。
  3. 如果选择持有股票,那么前一天就不能持有股票,因此dp[i][0]的值就是dp[i-1][0]0-prices[i]中的较大值,表示第i天持有股票时的最大利润。
  4. 如果选择不持有股票,那么前一天可以是持有股票或者不持有股票,取其中的较大值加上当前股票价格,即prices[i]+dp[i-1][0],表示第i天不持有股票时的最大利润。
  5. 最后,返回dp[len-1][1],表示最后一天不持有股票时的最大利润,即最终的最大利润。

复杂度

        时间复杂度:

                O(n)

         时间复杂度为O(n),其中n是prices数组的长度。因为我们需要遍历整个prices数组,每次计算dp[i][0]dp[i][1]都只需要常数时间操作。所以总体时间复杂度为O(n)。

        空间复杂度

                O(n)

        空间复杂度为O(n),其中n是prices数组的长度。因为使用了一个二维数组dp,大小为(len, 2),其中lenprices数组的长度。所以空间复杂度为O(n)。

c++ 代码

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; // 初始化第一天不持有股票的收益为0for(int i = 1;i<len;i++){dp[i][0]=max(dp[i-1][0],0-prices[i]); // 当前持有股票的最大收益,可以选择继续持有之前的股票或者买入新的股票dp[i][1]=max(dp[i-1][1],prices[i]+dp[i-1][0]); // 当前不持有股票的最大收益,可以选择继续不持有或者卖出当前持有的股票}return dp[len-1][1]; // 返回最后一天不持有股票的收益,即最大利润}
};

Java代码

  • 首先进行特判,如果输入数组prices为空,则直接返回0。
  • 然后创建一个二维数组dp,大小为(length, 2),其中length是输入数组prices的长度。dp[i][0]表示第i天持有股票时的最大收益,dp[i][1]表示第i天不持有股票时的最大收益。
  • 初始化dp[0][0]为买入第一天股票的价格,即-prices[0],而dp[0][1]初始化为0,表示第一天不持有股票的收益为0。
  • 使用循环遍历prices数组,从第二天开始。对于每一天,计算在该天持有或不持有股票的最大收益:
    • 对于持有股票的情况,可以选择继续持有之前的股票或者买入新的股票,取两者中较大的一个作为dp[i][0]的值。
    • 对于不持有股票的情况,可以选择继续不持有或者卖出当前持有的股票,取两者中较大的一个加上当前股票价格作为dp[i][1]的值。
  • 最后返回最后一天不持有股票时的收益,即dp[length-1][1],表示整个交易过程的最大利润。
class Solution {public int maxProfit(int[] prices) {if (prices == null || prices.length == 0) return 0; // 特判,如果输入数组为空,则直接返回0int length = prices.length;// dp[i][0]代表第i天持有股票的最大收益// dp[i][1]代表第i天不持有股票的最大收益int[][] dp = new int[length][2]; // 创建一个二维数组dp,大小为(length, 2)int result = 0; // 初始化结果为0dp[0][0] = -prices[0]; // 初始化第一天持有股票的收益为买入股票的价格dp[0][1] = 0; // 初始化第一天不持有股票的收益为0for (int i = 1; i < length; i++) { // 从第二天开始循环dp[i][0] = Math.max(dp[i - 1][0], -prices[i]); // 当前持有股票的最大收益,可以选择继续持有之前的股票或者买入新的股票dp[i][1] = Math.max(dp[i - 1][0] + prices[i], dp[i - 1][1]); // 当前不持有股票的最大收益,可以选择继续不持有或者卖出当前持有的股票}return dp[length - 1][1]; // 返回最后一天不持有股票的收益,即最大利润}
}

觉得有用的话可以点点赞,支持一下。

如果愿意的话关注一下。会对你有更多的帮助。

每天都会不定时更新哦  >人<  。

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

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

相关文章

NVMe FDP会被广泛使用吗?

文章开头&#xff0c;我们需要先了解固态硬盘的读写机制。我们知道&#xff0c;固态硬盘的存储单元是由闪存颗粒组成的&#xff0c;无法实现物理性的数据覆盖&#xff0c;只能擦除然后写入&#xff0c;重复这一过程。因而&#xff0c;我们可以想象得到&#xff0c;在实际读写过…

Mac VsCode g++编译报错:不支持C++11语法解决

编译运行时报错&#xff1a; [Running] cd “/Users/yiran/Documents/vs_projects/c/” && g 1116.cpp -o 1116 && "/Users/yiran/Documents/vs_projects/c/"1116 1116.cpp:28:22: warning: range-based for loop is a C11 extension [-Wc11-extensi…

Maven3.9.1安装及环境变量配置

一、Maven的下载与安装 maven各版本下载地址 打开链接后自行选择对应版本 下载完成后解压安装,最好别选择c盘,安装目录路径等使用英文,避免产生其他问题 我这里选择的是D盘 二、Maven的环境变量配置 2.1、右键点击此电脑选择属性&#xff0c;点击高级系统设置&#xff0c;点…

jenkins结合k8s部署动态slave

1、完成k8s连接 在完成jenkins的部署后现安装kubernets的插件 如果jenkins 是部署在k8s集群中只需要填写一下 如果是非本集群的部署则需要填写证书等 cat ./config echo ‘certificate-authority-data-value’ | base64 -d > ./ca.crt echo ‘client-certificate-data’ |…

结合组件库实现table组件树状数据的增删改

如图所示&#xff0c;可以实现树状数据的新增子项&#xff0c;新增平级&#xff0c;删除。主要用到了递归 代码&#xff1a; <template><el-table :data"tableData" style"width: 100%; margin-bottom: 20px" row-key"id" border def…

uniapp使用技巧及例子

前言 uniapp&#xff08;Universal Application&#xff09;是一种基于Vue.js的全端解决方案&#xff0c;允许开发者使用一套代码构建多个平台的应用程序。这些平台包括iOS、Android、H5、微信小程序、支付宝小程序等。uniapp的出现解决了跨平台开发的痛点&#xff0c;大大减少…

ce从初阶到大牛--动态网络部署

1.基于域名www.openlab.com可以访问网站内容为 welcome to openlab!!! systemctl stop firewalld setenforce 0 cd /etc/httpd/conf.d/ vim openlab.conf ** <VirtualHost 192.168.170.100:80>DocumentRoot /www/openlabServerName 192.168.170.100 </VirtualHost>…

排序算法之-选择

算法原理 在未排序的数列中找出最大&#xff08;或最小&#xff09;的元素&#xff0c;然后将其存入到已排序的数列起始位置&#xff0c;紧接着在剩余的未排序数列中继续查找最大&#xff08;或最小&#xff09;的元素&#xff0c;并将其放入到已排序的数列末尾&#xff0c;依…

行情分析——加密货币市场大盘走势(11.6)

大饼昨日下跌过后开始有回调的迹象&#xff0c;现在还是在做指标修复&#xff0c;大饼的策略保持逢低做多。稳健的依然是不碰&#xff0c;目前涨不上去&#xff0c;跌不下来。 以太周五给的策略&#xff0c;入场的已经止盈了&#xff0c;现在已经达到1884&#xff0c;已经全部吃…

Java —— 类和对象(一)

目录 1. 面向对象的初步认知 1.1 什么是面向对象 1.2 面向对象与面向过程 2. 类定义和使用 2.1 认识类 2.2 类的定义格式 3. 类的实例化(如何产生对象) 3.1 什么是实例化 3.2 访问对象的成员 3.3 类和对象的说明 4. this引用 4.1 为什么要有this引用 4.2 什么是this引用 4.3 th…

十一、K8S之持久化存储

持久化存储 一、概念 在K8S中&#xff0c;数据持久化可以让容器在重新调度、重启或者迁移时保留其数据&#xff0c;并且确保数据的可靠性和持久性。 持久化存储通常用于程序的状态数据、数据库文件、日志文件等需要在容器生命周期之外的数据&#xff0c;它可以通过各种存储解…

3.27每日一题(常系数线性非齐次方程的特解)

常系数非齐次线性方程的特解如何假设&#xff08;两种&#xff09;形式&#xff1a; 1、题目中 e 的 x 次幂以及 1&#xff0c;都是第一种&#xff1a;1可以看成为e的0次幂 注&#xff1a;题目给的多项式是特殊的形式&#xff0c;我们要设为一般的形式的多项式 2、题目中sin…

css基础之实现轮播图

原理介绍 图片轮播的原理是通过控制显示和隐藏不同的图片来实现图像的切换&#xff0c;从而创建连续播放的效果。用到的知识点有定位和定时器。 实现步骤&#xff1a; HTML 结构&#xff1a; 首先&#xff0c;需要在HTML中创建一个包含轮播图片的容器&#xff0c;通常使用 &l…

Verilog使用vscode

使用vscode打开.v文件 Tools setting texteditor vscode文件路径 [line number]:[file name] &#xff08;可能会出错&#xff0c;可以去vscode确认打开的文件路径&#xff0c;后经调整后改为 vscode文件路径 [file name]&#xff09; 安装插件 搜索Verilog 添加使用最多的 …

Vue3:解决基地址不同 数据交互http与https跨域问题

配置公共管理的api文件和vue.config.js可以解决跨域问题。一个项目对接不同的基地址和接口同理。 api export default {//接口基地址Millia: process.env.NODE_ENV development ? location.protocol // location.host /milliaApi : http://xx.xxx.xxxx/index.php/,Milli…

线上 kafka rebalance 解决

上周末我们服务上线完毕之后发生了一个kafka相关的异常&#xff0c;线上的kafka频繁的rebalance&#xff0c;详细的报错我已经贴到下面&#xff0c;根据字面意思&#xff1a;消费者异常 org.apache.kafka.clients.consumer.CommitFailedException: 无法完成提交&#xff0c;因为…

本周三商店更新:多款套装下线,四款升级武器带异色皮肤返厂

本周三将迎来26.2版本更新与11商店大更新&#xff0c;版本更新可点击26.2版本更新公告进行查看&#xff0c;这里不一一赘述了&#xff0c;下面大概罗列一下商店更新&#xff0c;有皮肤下架&#xff0c;大家还能趁最后时间入手&#xff0c;最重要的是四款升级武器返厂咯。 危险玩…

使用Postman工具做接口测试 —— 环境变量与请求参数格式!

引言 在上一篇笔记我们主要介绍了接口测试的基础知识与基本功能&#xff0c;本章主要介绍如何使用postman做接口测试。 配置环境变量和全局变量 环境变量和全局变量 环境管理中还可以点击“Global”添加全局变量&#xff0c;环境变量只有当选择了该环境时才生效&#xff0c;…

机器学习——CBOW负采样(未开始)

刚从前一个坑里&#xff0c;勉强爬出来&#xff0c;又掘开另一坑 看了很多文章B站up主。。。糊里糊涂 但是我发觉&#xff0c;对于不理解的东西&#xff0c;要多看不同up主写的知识分享 书读百遍&#xff0c;其意自现&#xff0c;我是不相信的&#xff0c;容易钻牛角尖 但是&am…

offsetof宏的使用、模拟实现及 (size_t)(((struct_type*)0)->mem_name)的解释

宏原型&#xff1a;offsetof(type,member) 作用&#xff1a;返回数据结构或联合体类型中成员的偏移量&#xff0c;以字节为单位 返回值&#xff1a;size_t类型的无符号整数 使用案例&#xff1a; #include <stdio.h> #include <stddef.h> struct foo {ch…