算法刷题打卡042 | 动态规划10

这一天的题目内容开启了买卖股票最佳时机的专题,两道最基础也是最经典的题目复习回顾买卖股票相关的动态规划问题。

LeetCode 121 买卖股票的最佳时机

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

买卖股票的第一个版本是只交易两次,分别是买入以及在买入之后的卖出。由于只有正利润才符合题目预期结果,当股票价格呈现非递增变化时,买卖股票无法获得收益(甚至有可能亏损),因此可以贪心地找左端最小值及其对应的右端最大值,取其中最大的差值。具体做法是遍历每天的股票价格,不断更新左端的最小值,同时计算当前价格与最小值的差值,更新结果:

class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        # 贪心写法
        minprice = prices[0]
        maxprofit = 0
        for i in range(1, len(prices)):
            maxprofit = max(maxprofit, prices[i]-minprice)
            minprice = min(minprice, prices[i])
        return maxprofit

 而用动态规划分析题目,按时间顺序,每一天的最大利润和前一天的状态息息相关,存在一个状态推导的过程。具体状态的定义比较讲究对问题的理解,比如对于股票的买卖,有持有和不持有两种状态,他们都能通过保持原有状态直接继承前一天的状态,也可以通过买卖操作更新,并且按题目要求取二者的最大值:

#include<algorithm>
class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int n = prices.size();
        // dp[i][0] 持有;dp[i][1] 不持有
        vector<vector<int>> dp(n, vector<int>(2));
        // 初始化
        dp[0][0] = -prices[0];
        for(int i=1; i < n; i++){
            // dp[i][0] = max(dp[i-1][0], dp[i-1][1] - prices[i]);
            dp[i][0] = max(dp[i-1][0], -prices[i]);
            dp[i][1] = max(dp[i-1][1], dp[i-1][0] + prices[i]);
        }
        return max(0, dp[n-1][1]);  // 最终要求的是最后一天不持有股票的状态(如果为负利润返回0)
    }
};

 要注意本题只能进行一次买入卖出,因此dp[i][0]更新时,当天买入一定是-prices[i],而不是像注释的那样从前一天不持有的状态减去prices[i],因为如果前一天属于已经交易完的不持有状态,在它的基础上买入就违反了买卖规则。实际上注释写法应该是属于不限制买卖次数的情境。

状态推导过程中只依赖前一天的状态,因此空间复杂度可进一步优化,不再赘述。

LeetCode 122 买卖股票的最佳时机II

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

这一题其实就是在上一题的基础上不限制买卖次数,题目的“最多只能持有一股股票”,其实就是要求每次买入前必须保证手头没有持有股票,也就是下一次买入前必须经过卖出操作,沿用上一题的代码:

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int n = prices.size();
        // dp[i][0] 持有;dp[i][1] 不持有
        vector<vector<int>> dp(n, vector<int>(2));
        // 初始化
        dp[0][0] = -prices[0];
        for(int i=1; i < n; i++){
            dp[i][0] = max(dp[i-1][0], dp[i-1][1] - prices[i]);
            // dp[i][0] = max(dp[i-1][0], -prices[i]);
            dp[i][1] = max(dp[i-1][1], dp[i-1][0] + prices[i]);
        }
        return max(0, dp[n-1][1]);  // 最终要求的是最后一天不持有股票的状态(如果为负利润返回0)
    }
};

贪心的解法就是遍历找所有递增区间,在每个递增区间的起点和终点分别进行买入和卖出,可以保证利润最大化:

class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        n = len(prices)
        if n < 2:
            return 0  # 无法进行交易
        # idx, total = 0, 0
        # # 方法是找上升区间
        # while idx < n:
        #     while idx < n - 1 and prices[idx] > prices[idx + 1]:
        #         idx += 1
        #     min_price = prices[idx]
        #     while idx < n - 1 and prices[idx] < prices[idx + 1]:
        #         idx += 1
        #     total += prices[idx] - min_price
        #     idx += 1
        
        # return total
        total = 0
        for i in range(1, n):
            total += max(0, prices[i] - prices[i-1])
        return total

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vue3之shallowRef以及使用对element-plus table的优化尝试

首先&#xff0c;先大概回顾一下相关概念吧 ref、shallowRef ref 接受一个内部值&#xff0c;返回一个响应式的、可更改的 ref 对象&#xff0c;此对象只有一个指向其内部值的属性 .value。 如果将一个对象赋值给 ref&#xff0c;那么这个对象将通过 reactive 转为具有深层次…

【vscode】检查到已经改正的错误,没有错误却检查到有错误

一、问题背景 下面这个名为test1.c的C代码&#xff0c;在vscode中用扩展code runner工具通过【run code】方式执行时&#xff0c; 出现了诸如’xxx’ does not name a type、‘xxx’ expected unqualified-id before ‘for’、i’does not name a type等错误。 于是本人把所…

[GXYCTF2019]BabyUpload

思路&#xff1a;先测试是否对文件名后缀检测 1,上传一个php文件 上传内容&#xff1a; GIF89a <?php eval($_POST["cmd"]);?>失败&#xff1a; 2&#xff0c;尝试上传其它类型的文件 构造%00截断的.jpg结尾尝试上传&#xff1a; 再次被拦截&#xff1a; …

摸鱼也可以效率翻倍:Python 统计 gitlab 代码量,定量统计发给领导

嗨害大家好鸭&#xff01;我是爱摸鱼的芝士❤ 一、确定需求 需求是公司大领导想要了解每周研发提交的代码量。 因为研发人员比较多&#xff0c; 想着用 python 做个自动化&#xff0c; 定时统计代码量并发送邮件给领导。 二、统计gitlab代码 首先安装第三方库python-gitlab&…

Hadoop基础介绍

Hadoop基础介绍一、总体介绍二、HDFS架构三、MapReduce结构四、YARN架构一、总体介绍 1、定义&#xff1a; 是一个开源的、可靠的、可扩展的分布式计算框架。 2、用途&#xff1a; &#xff08;1&#xff09;数据仓库 &#xff08;2&#xff09;PB级别数据的存储与处理。 3…

JetpackCompose从入门到实战学习笔记13——Compose中实现简单瀑布流

JetpackCompose从入门到实战学习笔记13——Compose中实现简单瀑布流 文章目录JetpackCompose从入门到实战学习笔记13——Compose中实现简单瀑布流1.简介&#xff1a;2.竖向的StaggeredGrid参数&#xff1a;3.简单使用如下&#xff1a;4.竖向瀑布流效果如下&#xff1a;5.横向的…

基于html+css的内容旋转

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

Solon v2.2.7 发布,支持 Java 20

Solon 是一个高效的 Java 应用开发框架&#xff1a;更快、更小、更简单。也是一个有自己接口标准规范的开放生态。 150来个生态插件&#xff0c;覆盖各种不同的应用开发场景&#xff1a; 相对于 Spring Boot 和 Spring Cloud 的项目&#xff1a; 启动快 5 &#xff5e; 10 倍…

MLSkin 5.3 for delphi Crack

MLSkin 是Delphi下面的一款皮肤组件&#xff0c;是基于Delphi标准组件继承而来&#xff0c;扩展了很多实用的属性功能供开发者调用&#xff1b;在使用上和标准的VCL组件相差不大&#xff0c;但显示风格却大不一样&#xff0c;可以很轻松地实现像QQ皮肤那样的效果&#xff0c;想…

镜头光学指标介绍----清晰度SFR

目录 简介 常用单位 lp/mm&#xff08;line-pairs/mm&#xff09; Cycle / pixel LW/PH&#xff08;line widths/ picture height) 转换关系 MTF MTF概念 MTF50&#xff0c;MTF50P SFR的计算方法 参考资料&#xff1a; 简介 在镜头选型或者对比中&…

【从零开始学习 UVM】10.2、UVM TLM —— UVM TLM Blocking Put Port

文章目录 UVM TLM Port Example1. 创建一个发送器类,其端口类型为 uvm_blocking_put_port2. 创建一个接收器类,实现 put 方法。3. 在更高层次上连接端口及其实现Put Port 阻塞行为任何组件都可以通过 TLM put port向另一个组件发送事务。接收组件应该定义 put port的实现。这…

【CSAPP】进程 | 上下文切换 | 用户视角下的并发进程

&#x1f4ad; 写在前面&#xff1a;本文将学习《深入理解计算机系统》的第六章 - 关于异常控制流和系统级 I/O 的 进程部分。CSAPP 是计算机科学经典教材《Computer Systems: A Programmers Perspective》的缩写&#xff0c;该教材由Randal E. Bryant和David R. OHallaron 合著…

流量整形(GTS和LR)

Generic Traffic Shaping通用流量整形 通用流量整形(简称GTS)可以对不规则或不符合预定流量特性的流量进行整形,以保证网络上下游之间的带宽匹配,避免拥塞发生。 GTS与CAR一样,都采用了令牌桶技术来控制流量。GTS与CAR的主要区别在于:利用CAR进行报文流量控制时,…

蓝桥杯之单片机学习(终)——关于之前文章的错误及更正(附:第十四届蓝桥杯单片机赛题)

文章目录零、吐槽一、关于自创模板&#xff0c;和自写模板库的问题二、关于 详解A/D、D/A、PCF8591 这篇文章一些小错误三、模板最终版本main.cds1302.conewire.honewire.ciic.hiic.c附、第十四届蓝桥杯单片机赛题零、吐槽 今年是矩阵键盘三个协议一起调用啊。真是一年比一年难…

免费CRM如何进行选择?

如今CRM领域成为炙手可热的赛道&#xff0c;很多CRM系统厂商甚至打出完全免费的口号&#xff0c;是否真的存在完全免费的crm系统&#xff1f;很多企业在免费使用过程中会出现被迫终止的问题&#xff0c;需要花费高价钱才能继续使用&#xff0c;那么&#xff0c;免费crm系统哪个…

用GPT-4写代码不用翻墙了?Cursor告诉你:可以~~

目录 一、介绍 二、使用方法 三、其他实例 1.正则表达式 2.自动化测试脚本 3.聊聊技术 一、介绍 Cursor主要功能是根据用户的描述写代码或者进行对话&#xff0c;对话的范围仅限技术方面。优点是不用翻墙、不需要账号。Cursor基于GPT模型&#xff0c;具体什么版本不祥&#…

【视频分割】【深度学习】MiVOS官方Pytorch代码-S2M模块DeepLavV3Plus网络解析

【视频分割】【深度学习】MiVOS官方Pytorch代码-S2M模块DeepLavV3Plus网络解析 MiVOS模型将交互到掩码和掩码传播分离&#xff0c;从而实现更高的泛化性和更好的性能。单独训练的交互模块将用户交互转换为对象掩码&#xff0c;本博客将讲解S2M(用户交互产生分割图)模块的深度网…

【Vue框架】Vue绑定样式及案例之行内样式——对象绑定样式与数组控制样式(附带源码案例)

文章目录一、Vue样式绑定1.1 Vue绑定class样式1.2 Vue绑定行内样式1.2.1 对象控制绑定样式1.2.2 数组控制绑定样式1.3 Vue绑定样式案例(标题排他)1.4 v-if和v-show指令1.5 v-if实现选项卡案例1.6 购物车实例一、Vue样式绑定 1.1 Vue绑定class样式 Vue通过v-bind动态样式绑定。…

前端基础-ES6

前端基础-ES61.let&const2.解构表达式数组解构对象解构字符串扩展函数优化map、reducePromise异步编排模块化本文引用了尚硅谷谷粒商城的内容 参考文档&#xff1a;https://blog.csdn.net/weixin_44364444/article/details/126198957 1.let&const var 声明的变量往往…

网络安全行业现在好混吗,工资水平怎么样?

前段时间看到有人私信&#xff1a;网络安全行业现在好混吗&#xff0c;工资水平怎么样&#xff1f;今天在这里做个回答&#xff0c;不知你所说的“好混吗”指的是什么&#xff1f; 薪资高&#xff0c;待遇好&#xff1f;不加班&#xff0c;活儿少&#xff1f;不受气&#xff0…
最新文章