动态规划LeetCode-121.买卖股票的最佳时机1
给定一个数组 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 <= 1050 <= prices[i] <= 104
我们这题用动态规划进行求解,一系列的买卖股票问题都是可以用动态规划来解决,我们从买卖股票的最佳时机1开始理解,后面的就好写多了。动规五部曲(dp含义、递推公式、初始化、遍历顺序、打印数组)
那我们买卖股票的有两种状态,一种是持有一种不持有,所以我们定义二维数组dp[i][0]、和dp[i][1],dp[i][0]表示第i天持有股票时手上所得的最大现金,dp[i][1]表示第i天不持有股票手上所得的最多现金。我们特别要注意一个点是,这里说到“持有”,不代表买入,我们dp[i][0]记录的是注意只是记录,记录第i天持有股票时手上所得的最大现金,而买入是一种结果,买入的话是不是会扣钱,买入某一天的股票则是-prices[i],而是否真正的要买入则要比较,是不是最低价格的买入,以便后续最高利润卖出。
那我们来思考递推公式,如果第i天持有股票即dp[i][0], 那么可以由两个状态推出来。
1.如果第i-1天就已经持有股票,持有股票就相当于买入,但只是相当于记录记录!并不是真正的买入,因为买入要最低价格的时候买入,我们每个dp[i][0]记录的是持有股票时最低价格,推导是最后dp[pricesSize-1][0]这个值就是真正买入的最低价格。dp[i-1][0]跟如果第i天买入(-prices[i])进行比较,买入的之后手上的现金就肯定为负,这时候进行比较最大值(手上最大的现金),如果保持现状,所得现金就是昨天持有股票的所得现金 即:dp[i - 1][0]
2.如果第i天买入股票,所得现金就是买入今天的股票后所得现金即:-prices[i]
如果第i天不持有股票即dp[i][1],那么也是可以由两个状态推出来
1.第i-1天就不持有股票,那么就保持现状,所得现金就是昨天不持有股票的所得现金 即:dp[i - 1][1]
2.第i天卖出股票,所得现金就是按照今天股票价格卖出后所得现金利润即:prices[i] + dp[i - 1][0]
最后返回的是dp[pricesSize-1][1]而不是dp[pricesSize-1][0],是为什么呢,因为最后不持有股票则是卖出了得到了利润。我们动态规划每一步缓存的都是手上得到的最大现金,一步步进行比较得出手上最大金钱延续到最后,最后的dp[pricesSize-1][0]得出的是真正买入时的最低价格是多少。dp[pricesSize-1][1]得出买入卖出的最大利润。

dp含义:dp[i][0] 表示第i天持有股票时的最大现金
dp[i][1] 表示第i天不持有股票时的最大现金
初始化:我们持有股票是记录记录,所以第0天持有,记录下来的应该就是dp[0][0]= -prices[0]。
第0天不能卖出,即dp[0][1]=0,后面的就可以从前面的推导得出。
递推公式:dp[i][0] = dp[i-1][0] > -prices[i] ? dp[i-1][0] : -prices[i];
dp[i][1] = dp[i-1][1] > dp[i-1][0] + prices[i] ? dp[i-1][1] : dp[i-1][0] + prices[i];
遍历顺序:从前往后
打印数组:当遇到疑惑或者提交错误时,打印数组出来比较快速的看看哪一步有错。
以下是我在力扣c语言提交的代码,仅供参考:
int maxProfit(int* prices, int pricesSize) {// dp[i][0] 表示第i天持有股票时的最大现金// dp[i][1] 表示第i天不持有股票时的最大现金int dp[pricesSize+1][2];//初始化//记录第一天持有,现金为-prices[0]dp[0][0] = -prices[0];//第一天无法卖出,利润为0dp[0][1] = 0;for(int i = 1;i<pricesSize;i++){// 第i天持有股票:要么之前已持有,要么当天买入(取较大值)dp[i][0] = dp[i-1][0] > -prices[i] ? dp[i-1][0] : -prices[i];// 第i天不持有股票:要么之前已卖出,要么当天卖出(利润为当天价格+前一天持有现金)dp[i][1] = dp[i-1][1] > dp[i-1][0] + prices[i] ? dp[i-1][1] : dp[i-1][0] + prices[i];}// 最大利润即为最后一天不持有股票的状态return dp[pricesSize-1][1];
}
相关文章:
动态规划LeetCode-121.买卖股票的最佳时机1
给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可以从这笔交易中获取的最大利润。…...
pytest+request+yaml+allure 接口自动化测试全解析[手动写的跟AI的对比]
我手动写的:Python3:pytest+request+yaml+allure接口自动化测试_request+pytest+yaml-CSDN博客 AI写的:pytest+request+yaml+allure 接口自动化测试全解析 在当今的软件开发流程中,接口自动化测试扮演着至关重要的角色。它不仅能够提高测试效率,确保接口的稳定性和正确性…...
单片机通讯中的时序图:初学者的入门指南
一、什么是时序图? 在单片机的世界里,时序图是一种非常重要的工具,它用于描述信号在时间上的变化规律。简单来说,时序图就像是信号的“时间线”,它展示了各个信号线在不同时间点上的电平状态。通过时序图,我…...
#渗透测试#批量漏洞挖掘#微商城系统 goods SQL注入漏洞
免责声明 本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停…...
Lua中文语言编程源码-第十一节,其它小改动汉化过程
__tostring 汉化过程 liolib.c metameth[] {"__转换为字符串", f_tostring}, lauxlib.c luaL_callmeta(L, idx, "__转换为字符串") lua.c luaL_callmeta(L, 1, "__转换为字符串") __len 汉化过程 ltm.c luaT_eventname[] ltablib.c c…...
import { Component, Vue, Prop, Watch } from ‘vue-property-decorator‘
文章目录 导入部分的解释总结Vue 3 的推荐替代方案总结 你提供的代码片段是使用 vue-property-decorator 库的示例,这是一个第三方库,它提供了 Vue 组件的装饰器,使得编写类风格的 Vue 组件更加方便。以下是对代码中每个部分的详细解释&…...
C++基础系列【5】namespace using
本文主要介绍namespace和using。 什么是namespace? namespace是指命名空间,表示某个变量标识符的可见空间,比如下面的代码: namespace Meow {int k 100; }int main() {std::cout << k << std::endl; }这段代码中在…...
MySQL万能备份脚本
此脚本适用于 MySQL 各个生命周期的版本 #!/bin/bash # mybackup.sh# 备份保留天数,建议保留三天 days7 # 备份时间 time$(date %Y%m%d%H%M%S) # 备份保存路径 backup_dir/opt/backup # 备份工具 toolmysqldump # 端口 port"3306" # 是否采用 --all-data…...
分桶函数的使用
除了 NTILE 函数,SQL 中还有其他一些与 分桶(bucketization)相关的函数,虽然它们的实现方式不同,但都涉及将数据分成多个区间或组。以下是一些常用的分桶函数: 1. CASE 语句 虽然 CASE 不是开窗函数&…...
5. k8s二进制集群之ETCD集群部署
下载etcd安装包创建etcd配置文件准备证书文件和etcd存储目录ETCD证书文件安装(分别对应指定节点)创建证书服务的配置文件启动etcd集群验证etcd集群状态继续上一篇文章《k8s二进制集群之ETCD集群证书生成》下面介绍一下etcd证书生成配置。 下载etcd安装包 https://github.com…...
JMeter通过BeanShell写入CSV文件中的中文乱码
在 JMeter 中通过 BeanShell 写入 CSV 文件时,如果出现中文乱码问题,通常是因为文件编码不匹配。默认情况下,FileWriter 使用的是系统默认编码(可能是 ISO-8859-1 或其他非 UTF-8 编码),而中文字符需要 UTF…...
智能化转型2.0:从“工具应用”到“价值重构”
过去几年,“智能化”从一个模糊的概念逐渐成为企业发展的核心议题。2024年,随着生成式AI、大模型、智能体等技术的爆发式落地,中国企业正式迈入智能化转型的2.0时代。这一阶段的核心特征是从单一场景的“工具应用”转向全链条的“价值重构”&…...
X Window System 架构概述
X Window System 架构概述 1. X Server 与 X Client 这里引入一张维基百科的图,在Linux系统中,若用户需要图形化界面,则可以使用X Window System,其使用**Client-Server**架构,并通过网络传输相关信息。 X…...
【ArcGIS Pro 简介1】
ArcGIS Pro 是由 Esri (Environmental Systems Research Institute)公司开发的下一代桌面地理信息系统(GIS)软件,是传统 ArcMap 的现代化替代产品。它结合了强大的空间分析能力、直观的用户界面和先进的三维可视化技术…...
启明星辰发布MAF大模型应用防火墙产品,提升DeepSeek类企业用户安全
2月7日,启明星辰面向DeepSeek等企业级大模型业务服务者提供的安全防护产品——天清MAF(Model Application Firewall)大模型应用防火墙产品正式发布。 一个新赛道将被开启…… DeepSeek的低成本引爆赛道规模 随着DeepSeek成为当前最热的现象级…...
小米AI眼镜官微上线,将与小米15 Ultra同台亮相,近屿智能用心培育 AI 人才
近日,小米眼镜官微已正式上线,认证主体为小米通讯技术有限公司。据悉,小米AI眼镜已获得入网许可,并计划提前至2月发布,与小米15 Ultra同台亮相。 此前,小米AI眼镜原定于2025年3月至4月发布。早在去年&#…...
Mac下使用brew安装go 以及遇到的问题
首先按照网上找到的命令进行安装 brew install go 打开终端输入go version,查看安装的go版本 go version 配置环境变量 查看go的环境变量配置: go env 事实上安装好后的go已经可以使用了。 在home/go下新建src/hello目录,在该目录中新建…...
在rtthread中,scons构建时,它是怎么知道是从rtconfig.h找宏定义,而不是从其他头文件找?
在rtthread源码中,每一个bsp芯片板级目录下都有一个 SConstruct scons构建脚本的入口, 在这里把rtthread tools/目录下的所有模块都添加到了系统路径中: 在tools下所有模块中,最重要的是building.py模块,在此脚本里面…...
Unity游戏(Assault空对地打击)开发(7) 爆炸效果
效果 准备 首先请手搓一个敌军基地。 然后添加一个火焰特效插件或者自建。 爆炸脚本编写 新建一个脚本命名为Explode。 无需挂载到对象上。 首先是全部代码。 using System.Collections; using System.Collections.Generic; using System.Linq; using TMPro; using UnityEngine…...
嵌入式面试题 C/C++常见面试题整理_7
一.什么函数不能声明为虚函数? 常见的不能声明为虚函数的有:普通函数(非成员函数):静态成员函数;内联成员函数;构造函数;友元函数。 1.为什么C不支持普通函数为虚函数?普通函数(非成员函数)只能被overload,不能被override,声明为虚函数也没有什么意思…...
excel实用问题:提取文字当中的数字进行运算
0、前言: 这里汇总在使用excel工作过程中遇到的问题,excel使用wps版本,小规模数据我们自己提取数据可行,大规模数据就有些难受了,因此就产生了如下处理办法。 需求:需要把所有文字当中的数字提取出来&…...
【prompt实战】AI +OCR技术结合ChatGPT能力项目实践(BOL提单识别提取专家)
本文原创作者:姚瑞南 AI-agent 大模型运营专家,先后任职于美团、猎聘等中大厂AI训练专家和智能运营专家岗;多年人工智能行业智能产品运营及大模型落地经验,拥有AI外呼方向国家专利与PMP项目管理证书。(转载需经授权) 目录 1. 需求背景 2. 目标 3. BOL通用处理逻辑…...
昇思打卡营第五期(MindNLP特辑)番外:硅基流动 x 华为云DeepSeek V3 API推理MindTinyRAG
1.前言 前脚,DeepSeek面临的巨头企业官宣加入vs多国政府下场质疑的冰火两重天局势尚未平静(DeepSeek在美两重天:五大巨头接入,政府诚惶诚恐);后脚,OpenAI被逼急,凌晨亮出全新推理…...
APP广告变现如何优化广告填充率,提升变现收益?
APP广告变现对接聚合广告平台可以提升广告变现效率,最大化广告收益。#APP广告变现# 一般来说,广告填充率越高,意味着广告采买方数量越多,可以将广告库存卖掉。但实际的广告变现业务中,100%的广告填充率几乎无法达成。…...
DeepSeek R1 Distill Llama 70B(免费版)API使用详解
DeepSeek R1 Distill Llama 70B(免费版)API使用详解 在人工智能领域,随着技术的不断进步,各种新的模型和应用如雨后春笋般涌现。今天,我们要为大家介绍的是OpenRouter平台上提供的DeepSeek R1 Distill Llama 70B&…...
【文件上传、秒传、分片上传、断点续传、重传】
文章目录 获取文件对象文件上传(秒传、分片上传、断点续传、重传)优化 获取文件对象 input标签的onchange方法接收到的参数就是用户上传的所有文件 <html lang"en"><head><title>文件上传</title><style>#inp…...
LabVIEW与PLC交互
一、写法 写命令立即读出 写命令后立即读出,在同一时间不能有多个地方写入,因此需要在整个写入后读出过程加锁 项目中会存在多个循环并行执行该VI,轮询PLC指令 在锁内耗时,就是TCP读写的实际耗时为5-8ms,在主VI六个…...
树莓派5添加摄像头 在C++下调用opencv
由于树莓派5 os系统升级,正常libcamera创建对象每次失败。 改如下方法成功。 1 创建管道 rpicam-vid -t 0 --codec mjpeg -o udp://127.0.0.1:8554 > /dev/null 2>&1 2 opencv从管道里读取 #include <opencv2/opencv.hpp> #include <iostream>int mai…...
【Redis实战】投票功能
1. 前言 现在就来实践一下如何使用 Redis 来解决实际问题,市面上很多网站都提供了投票功能,比如 Stack OverFlow 以及 Reddit 网站都提供了根据文章的发布时间以及投票数计算出一个评分,然后根据这个评分进行文章的展示顺序。本文就简单演示…...
【开源AI】AI一页一页读PDF
【开源AI】AI一页一页读PDF 可以在这里看 : 让AI 处理 PDF 文件,提取其中的知识点,并生成总结。 只是无法修改,后续若有更新在csdn这里。 【OpenAI】 API 更新: JSON 结构化输出约束机制( JSON Schema) 的一次实战。知识库的JSON Schema形式 每一页都要总结,总结的知识…...
