剑指offer(C++)-JZ63:买卖股票的最好时机(一)

news2025/1/14 0:54:28

作者:翟天保Steven
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处

题目描述:

假设你有一个数组prices,长度为n,其中prices[i]是股票在第i天的价格,请根据这个价格数组,返回买卖股票能获得的最大收益

1.你可以买入一次股票和卖出一次股票,并非每天都可以买入或卖出一次,总共只能买入和卖出一次,且买入必须在卖出的前面的某一天

2.如果不能获取到任何利润,请返回0

3.假设买入卖出均无手续费

数据范围:0≤n≤10^5,0≤val≤10^4

要求:空间复杂度 O(1),时间复杂度 O(n)

 

示例:

输入:

[8,9,2,5,4,7,1]

返回值:

5

说明:

在第3天(股票价格 = 2)的时候买入,在第6天(股票价格 = 7)的时候卖出,最大利润 = 7-2 = 5 ,不能选择在第2天买入,第3天卖出,这样就亏损7了;同时,你也不能在买入前卖出股票。

解题思路:

本题是动态规划的经典题目。解题思路如下:

1.定义一个多行两列的数组。第一列存储,截止到第i天时股票不持股能达到的最大收益;第二列存储,截止到第i天时股票持股能保持的最大收益。

2.第一天无法卖出,因为没有持股,所以dp[0][0]自然是0,若第一天买入,则收益就是负当天的股价。

3.从第二天开始到最后一天,循环刷新截止到某一天时最大的收益情况。

4.第i天不持股的最大收益由两个情况决定:一是第i-1天不持股的最大收益,如果该值较大,说明在前面已经完成了较优的交易;二是第i-1天持股的最大收益,在第i天卖出了,进入不持股状态,此时如果卖出的金额比之前买入的金额大,那么该值为正,如果该值较小,说明虽然完成了低买高卖的操作,但是收益并不如之前的某个操作。

5.第i天持股的最大收益由两个情况决定:一是第i-1天持股的最大收益,如果该值较大,说明前面已经拿到了较便宜的筹码;二是第i天股价的负值,说明在当天进行了买入。

6.题目的结果就是数组中最后一行第一列的数值,也就是最后一天不持股能达到的最大收益。

测试代码:

class Solution {
public:

    int maxProfit(vector<int>& prices) {
        int size = prices.size();
        // dp为多行两列的数组
        // 第一列表示股票不持股能达到的最大收益
        // 第二列表示股票持股能保持的最大收益
        vector<vector<int>> dp(size, vector<int>(2, 0));
        // 第一天无法卖出,因为没有持股
        dp[0][0] = 0;
        // 第一天买入股票,进入持股状态,收益为减去当天股价
        dp[0][1] = -prices[0];
        // 动态规划刷新第二天至最后一天的结果
        for(int i = 1; i < size; ++i){
            // 第i天不持股的最大收益由两个情况决定:
            // 一是第i-1天不持股的最大收益,如果该值较大,说明已经完成了较优的交易
            // 二是第i-1天持股的最大收益,在第i天卖出了,进入不持股状态,
            // 此时如果卖出的金额比之前买入的金额大,那么该值为正,后续
            // 除非有更大的买卖差值,否则该值不会刷新
            dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] + prices[i]);
            // 第i天持股的最大收益由两个情况决定:
            // 一是第i-1天持股的最大收益,如果该值较大,说明前面已经拿到了较便宜的筹码
            // 二是第i天股价的负值,说明在当天进行了买入
            dp[i][1] = max(dp[i - 1][1], -prices[i]);
        }
        // 最后一天不持股能达到的最大收益就是最优结果
        return dp[size - 1][0];
    }
};

 

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

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

相关文章

FreeMen正式上线,让工作更自由

“让工作更自由”&#xff0c;开屏页上六个大字宣告着FreeMen正式上线&#xff0c;全新的FreeMen APP也正式登录各大手机应用市场。作为一款专注IT技术者圈子的APP&#xff0c;其上线标志着助力程序员职业道路上向前迈进一大步。 FreeMen相关负责人表示&#xff0c;基本上10个职…

基于java+Springboot操作系统教学交流平台详细设计实现

基于javaSpringboot操作系统教学交流平台详细设计实现 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java毕设项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末获取源…

【C语言】使用指针时出现的各种错误总结以及处理方法

&#x1f3d6;️作者&#xff1a;malloc不出对象 ⛺专栏&#xff1a;《初识C语言》 &#x1f466;个人简介&#xff1a;一名双非本科院校大二在读的科班编程菜鸟&#xff0c;努力编程只为赶上各位大佬的步伐&#x1f648;&#x1f648; 目录前言一、什么是野指针二、野指针出现…

Redis主从哨兵集群

主从 主从同步原理 1.全量同步 1.从节点刚连接到主节点时&#xff0c;主动请求数据同步 2.主节点判断是否是第一次同步&#xff0c;如果是&#xff0c;就返回主节点的数据版本信息 3.随后&#xff0c;主节点执行bgsave&#xff0c;生成RDB文件&#xff0c;并发送给从节点 4.这…

Java时间类

时间在Java中是两个类 Date 和 Calendar Date类 Date是在Java.util包中的也就是工具包。 测试 输出的是当前的系统时间 修改idea中的注释的颜色&#xff1a; 是date不是data package org.data; import java.util.Date; public class Test { public static void main(…

【Oracle】20230106PLSQL中文不显示,全部为?解决流程

问题&#xff1a;查询的表中有中文数据&#xff0c;全部显示为&#xff1f; 解决途径1&#xff1a;修改注册表以及环境变量&#xff08;改系统变量&#xff01;不要只改用户变量&#xff09; Oracle使用——PLSQL的中文乱码显示全是问号_海蓝树的博客-CSDN博客_plsql无法显示…

上线网站详细介绍(服务器购买-域名申请-SSL证书申请)

文章目录上线之前的准备工作&#xff0c;通俗的来讲&#xff1a;服务器是什么-云服务器购买域名解释-域名备案-域名如何申请①什么是域名&#xff0c;为什么要域名&#xff1f;②为什么非要域名备案和不备案的区别&#xff1f;③自己的主机怎么备案-自己的电脑可以作为服务器吗…

系分架构 - 软件架构设计

个人总结&#xff0c;仅供参考&#xff0c;欢迎加好友一起讨论 文章目录系分&架构 - 软件架构设计考点摘要概念架构的 4 1 视图软件架构风格经典五大架构风格调用/返回风格独立构件风格虚拟机风格仓库风格层次架构风格二层C/S架构三层C/S架构B/S架构混合架构风格闭环控制架…

Linux 软件管理 RPM 管理工具

概念引入 &#xff1a; # 首先提出一个问题&#xff0c;我们在 Linux 操作系统中是如何 安装软件的 &#xff1f;&#xff1f; >>> 在 Linux 系统中&#xff0c;安装软件是有三种方式 >>> 第一种 &#xff1a; RPM 管理工具 第二种 &#xff1a; …

如何在新环境接手项目?(上)【洞见2】

01、世界真实情况根据IDC机构在2022年统计显示&#xff0c;截止2021年我国中小企业数量已达到4881万家&#xff0c;同比增长8.5%。中小企业的行业分布不均匀&#xff0c;超过70%的中小企业分布于专业服务业&#xff08;含互联网和科技服务&#xff09;、物流批发、零售和制造业…

剑指offer----C语言版----第十一天

目录 1. 数值的整数次方 1.1 运行超时的思路 1.2 思路一: 快速幂 (递归实现) 1.3 思路二: 快速幂 (迭代实现) 1. 数值的整数次方 原题链接: 剑指 Offer 16. 数值的整数次方 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/shu-zhi-de-zheng-shu-ci-f…

web3学习:什么是以太坊

以太网是“世界的计算机”&#xff0c;这是以太坊平台的一种常见描述。这是什么意思呢&#xff1f;让我们首先从关注计算机科学的描述开始&#xff0c;然后对以太坊的功能和特性进行更实际的解读&#xff0c;并将其与比特币和其他分布式账本技术&#xff08;简单起见&#xff0…

深度学习笔记:神经网络(2)

对于神经网络上一篇文章&#xff0c;可见&#xff1a;https://blog.csdn.net/Raine_Yang/article/details/128473486?spm1001.2014.3001.5501 神经网络各层信号传递的实现&#xff1a; 对于全连接网络&#xff0c;连接权重的个数为&#xff08;前一层神经元总数 * 后一次神经…

el-table(type=“selection“)多选框两种回显

目录 一、前端数据回显&#xff08;页面间数据展示&#xff09; 1、图篇帮助理解 2、描述&#xff1a; 3、代码 4、两个API&#xff0c;一个v-model 二、数据库数据回显 1、描述&#xff1a; 2、核心代码: 3、比较完整代码&#xff1a;(这是element ui官方文档上的) 4…

XMLHttpRequest 对象(AJAX通信)

1.XMLHttpRequest 对象是什么&#xff1f; 浏览器与服务器之间&#xff0c;采用 HTTP 协议通信。用户在浏览器地址栏键入一个网址&#xff0c;或者通过网页表单向服务器提交内容&#xff0c;这时浏览器就会向服务器发出 HTTP 请求。 1999年&#xff0c;微软公司发布 IE 浏览器…

基于STM32F411使用SPI+DMA驱动LCD

先看效果 F411CE 硬件SPI&#xff0b;DMA驱动LCD基于HAL库 其实HAL库我用不太习惯&#xff0c;一直也是用的标准库 但HAL库确实是好上手一些&#xff0c;就迅速创建一个新的template 这次就当尝试一下吧&#xff0c;因为用的比较少&#xff0c;我会记录的详细 如图点击&…

火山引擎DataLeap数据调度实例的 DAG 优化方案

更多技术交流、求职机会&#xff0c;欢迎关注字节跳动数据平台微信公众号&#xff0c;并进入官方交流群 实例 DAG 介绍 DataLeap 是火山引擎自研的一站式大数据中台解决方案&#xff0c;集数据集成、开发、运维、治理、资产管理能力于一身的大数据研发治理套件。在平台中&…

从0到1完成一个Vue后台管理项目(四、引入axios、配置路由)

往期 从0到1完成一个Vue后台管理项目&#xff08;一、创建项目&#xff09; 从0到1完成一个Vue后台管理项目&#xff08;二、使用element-ui&#xff09; 从0到1完成一个Vue后台管理项目&#xff08;三、使用SCSS/LESS&#xff0c;安装图标库&#xff09; axios axios就是…

手握智算中心“绿洲”,毫末跑在中美自动驾驶长跑第一线

作者 | 白日梦想家 编辑 | 王博2022年过去&#xff0c;数据驱动成为自动驾驶演进共识。沿着数据驱动这条路线&#xff0c;自动驾驶加速迈入智算时代。 智算中心应运而生。 实际上&#xff0c;将智算引入自动驾驶的开先河者是特斯拉&#xff0c;其率先发布了专用于自动驾驶训练的…

登录与授权

目录 1.获取用户信息 1.button.open-type.getUserInfo 2.open-data组件 3.wx.getUserProfile(Object object) 头像昵称填写功能 2.登录 登录的流程图 sessin_key 3.授权 wx.openSetting wx.getSetting wx.authorize 手机号授权 登录与授权是两个不关联的事情&…