力扣刷题-122买卖股票的最佳时机

在这里插入图片描述
题目要求如上,这里可以有两种解题思路,一种是利用动态规划去求解,一种是用贪心去求解。
首先看下动态规划的方法。

用动归去解决

动态规划最重要的就是要想出来递推公式(这个真的很难),但是一旦想清楚递推公式,写代码就很轻松,其实感觉这里的算法题都是这种,主要考察的是思路而不是工程能力。
首先我们观察题目发现,这里说明了每天最多只能持有一只股票,因此这里的每天的状态只有两种:

  • 不持有股票
  • 持有股票

那我们最后只有返回两种状态下的最大利润就可以了,有时候想不明白可以先想3天的情况,会更好推理。我们定义:

  • d p [ i ] [ 0 ] dp[i][0] dp[i][0] 表示第i天不持有股票所获得的最大利润
  • d o [ i ] [ 1 ] do[i][1] do[i][1] 表示第i天持有股票所获得的最大利润

先来看不持有股票的情况:

  1. 前一天持有股票但今天卖出了,此时截止今天的最大收益为:dp[i-1][1] + prices[i]
  2. 前一天没有持有股票而且今天也不买,此时截止今天的最大收益为:dp[i-1][0]

因此对于没有持有股票来说,递推公式为:
d p [ i ] [ 0 ] = m a x ( d p [ i − 1 ] [ 1 ] + p r i c e s [ i ] , d p [ i − 1 ] [ 0 ] ) dp[i][0] = max(dp[i-1][1] + prices[i], dp[i-1][0]) dp[i][0]=max(dp[i1][1]+prices[i],dp[i1][0])
再来看持有股票的情况:

  1. 前一天持有股票今天也不能买了,此时截止今天的最大收益为:dp[i-1][1]
  2. 前一天没有持有股票今天买入股票,此时截止今天的最大收益为:dp[i-1][0] - prices[i]

因此对于没有持有股票来说,递推公式为:
d p [ i ] [ 1 ] = m a x ( d p [ i − 1 ] [ 0 ] − p r i c e s [ i ] , d p [ i − 1 ] [ 1 ] ) dp[i][1] = max(dp[i-1][0] - prices[i], dp[i-1][1]) dp[i][1]=max(dp[i1][0]prices[i],dp[i1][1])
对于初始状态: d p [ 0 ] [ 0 ] = 0 , d p [ 0 ] [ 1 ] = − p r i c e s [ 0 ] dp[0][0]=0, dp[0][1]=-prices[0] dp[0][0]=0,dp[0][1]=prices[0]
有了初始状态和递推公式,代码岂不是手到擒来:

def solve(prices):days = len(prices)if days == 0:return 0rst = [[0, 0]] * daysrst[0][0] = 0  # 第i天不持有股票能获得的利益rst[0][1] = -prices[0]  # 第i天持有股票能获得的利益for i in range(1, days):rst[i][0] = max(rst[i - 1][0], rst[i - 1][1] + prices[i])rst[i][1] = max(rst[i - 1][1], rst[i - 1][0] - prices[i])return max(rst[-1])

贪心思路

真的觉得贪心就是脑筋急转弯。贪心思路很好理解,但是一般很难想到。
既然我的目的是计算出最大收益,那我只要保证我每天的收益都是最大的就可以了。那我怎么保证呢?只要我每天的收益都是正的,那就是最大收益咯。
r s t = r s t + m a x ( 0 , p [ i ] − p [ i − 1 ] ) rst = rst+ max(0, p[i]-p[i-1]) rst=rst+max(0,p[i]p[i1])

代码也超简单:

def greed_solve(prices):rst = 0for i in range(1, len(prices)):rst += max(0, prices[i] - prices[i - 1])return rst

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

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

相关文章

EasyExcel生成多sheet页的excel

一、controller层 ApiOperation(value "明细查询导出") PostMapping(value "/SummaryDetailExport") public void summaryDetailExport(RequestBody SearchDTO dto, HttpServletResponse response) throws IOException {reportService.deptPackagingSum…

Python函数装饰器的用法

Python函数装饰器的用法 文章目录 1.装饰器的优点2. 使用装饰器前3. 使用装饰器后 装饰器是Python中一种强大的语法特性,它允许在不修改已有代码的情况下,对函数或类进行增强或修改。装饰器的本质是一个函数,它接受一个函数作为参数&#xf…

软件测试面试最全八股文

请你说一说测试用例的边界 参考回答: 边界值分析法就是对输入或输出的边界值进行测试的一种黑盒测试方法。通常边界值分析法是作为对等价类划分法的补充,这种情况下,其测试用例来自等价类的边界。 常见的边界值 1)对16-bit 的整数而言 32…

故障排查:rpm安装报错事务锁定(can‘t create transaction lock on /var/lib/rpm/.rpm.lock)

博客主页:https://tomcat.blog.csdn.net 博主昵称:农民工老王 主要领域:Java、Linux、K8S 期待大家的关注💖点赞👍收藏⭐留言💬 目录 故障详情故障原因解决办法 故障详情 自己编写spec文件,制…

《C++ Primer》第10章 算法(二)

参考资料: 《C Primer》第5版《C Primer 习题集》第5版 10.4 再探迭代器(P357) 除了为每个容器定义的迭代器外,头文件 iterator 中还定义了额外的几种迭代器: 插入迭代器(insert iterator)&…

AMESim与MATLAB联合仿真demo

本文是AMESim与MATLAB联合仿真的demo,记录一下如何进行联合仿真。 AMESim与MATLAB联合仿真可以大幅度提高工作效率。 author:xiao黄 缓慢而坚定的生长 csdn:https://blog.csdn.net/Python_Matlab?typeblog主页传送门 博主的联合仿真环境如下&#xff…

数字图像处理(实践篇)十五 基于傅里叶变换的高通滤波和低通滤波

目录 一 Numpy 实现傅里叶变换 1 涉及的函数 2 实践 二 OpenCV 实现傅里叶变换 1 涉及的函数 2 实践 为了有效地和快速地对图像进行处理和分析,常常需要将原定义在图像空间的图像以某种形式转换(正变换)到另外一些空间,并利…

物业报修管理系统

物业报修管理系统是一种能够提高物业管理效率和服务质量的软件,它可以帮助物业公司和业主之间实现快速、方便、高效的报修沟通和处理。 但是很多物业公司还在使用传统的报修方式,比如电话、纸质表格、微信群等,这些方式存在很多问题&#xff…

Linux系统编程:进程总结

这一章主要为进程的基本内容作一个总结,为后面的多进程多线程并发作一个铺垫。 进程标识符pid pid类型为 pid_t。 在涉及有关进程相关内容的时候,一定要熟悉 ps 命令的使用,该命令专门用来打印当前系统的进程信息: 这里经常使用…

【Python数据结构与算法】--- 递归算法的应用 ---[乌龟走迷宫] |人工智能|探索扫地机器人工作原理

🌈个人主页: Aileen_0v0 🔥系列专栏:PYTHON数据结构与算法学习系列专栏💫"没有罗马,那就自己创造罗马~" 目录 导言 解决过程 1.建立数据结构 2.探索迷宫: 算法思路 递归调用的“基本结束条件” 3.乌龟走迷宫的实现代码: …

【MATLAB源码-第92期】基于simulink的QPSK调制解调仿真,采用相干解调对比原始信号和解调信号。

操作环境: MATLAB 2022a 1、算法描述 QPSK,有时也称作四位元PSK、四相位PSK、4-PSK,在坐标图上看是圆上四个对称的点。通过四个相位,QPSK可以编码2位元符号。图中采用格雷码来达到最小位元错误率(BER) —…

Electronica慕尼黑电子展 Samtec团队与21ic分享虎家产品与方案

【摘要/前言】 “希望但凡是能够使用到连接器的场合都有Samtec的身影” 在慕尼黑上海电子展现场,Samtec华东区销售经理章桢彦先生在与21ic副主编刘岩轩老师的采访中,如是说道。这是一种愿景,更是Samtec的努力方向。短短一句话,…