力扣刷题-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.mzph.cn/news/185778.shtml

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

相关文章

VMware与Linux安装

VM与Linux安装 1、安装VMware ​ 这里安装Vm主要是为了安装Linux系统,除了相对云服务器,比较大众化的操作,当然更多的是熟悉Linux操作 1、Windows安装 ​ (1) 下载链接,目前版本上下载VM15的版本即可https://www.vmware.com/p…

阿里云服务器部署node和npm

目录 1.链接服务器2.找到node 下载地址3获取链接地址4下载到linux5.解压6.重命名 解压后的文件7.配置环境变量7.1复制当前的bin目录7.2vim /etc/profile7.3在按下ESC按键 8.重启环境变量9.输入node10.npm配置加速镜像 1.链接服务器 2.找到node 下载地址 https://nodejs.org/d…

CTO对生活和工作一点感悟

陌生人,你好啊。 感谢CSDN平台让我们有了隔空认识,交流的机会。 我是谁? 我呢,毕业快11年,在网易做了几年云计算,后来追风赶上了大数据的浪潮,再到后来混迹在AI、智能推荐等领域。 因为有一颗…

eNSP实验

前言 本文记录了使用eNSP进行组网,学习、巩固一些之前学的网络基础知识和协议。 一:同网段、网关互通 网络拓扑如下: AR1的配置: interface G0/0/0 ip address 192.168.10.1 24 PC1和PC2的配置(IP地址和网关设置) 最终实现PC1…

强芯铸魂,生态共赢!麒麟信安出席2023龙芯产品发布暨用户大会

11月28日,“到中流击水——2023龙芯产品发布暨用户大会”在北京国家会议中心隆重举办,会上发布新一代通用处理器龙芯3A6000、打印机主控芯片龙芯2P0500重磅成果。主管部门领导、专家学者、权威媒体等4000余人齐聚大会,麒麟信安作为龙芯合作伙…

【Linux学习】文件描述符重定向缓冲区

目录 九.文件描述符 9.1 文件描述符概念 9.2 文件描述符的分配规则 9.3 重定向 9.3.1 常见的重定向操作 9.3.2 重定向的原理 9.4 缓冲区 9.4.1 缓冲区概念 9.4.2 缓冲区刷新策略 9.4.3 C语言的缓冲区在哪里? 九.文件描述符 9.1 文件描述符概念 在上一篇讲到基础IO时,我们说到…

【C++】: unordered_map的使用

1、概念 key 键值的类型。unordered_map中的每个元素都是由其键值唯一标识的。 T 映射值的类型。unordered_map中的每个元素都用来存储一些数据作为其映射值。 Hash 一种一元函数对象类型,它接受一个key类型的对象作为参数,并根据该对象返回size_t类型…

Flask SocketIO 实现动态绘图

Flask-SocketIO 是基于 Flask 的一个扩展,用于简化在 Flask 应用中集成 WebSocket 功能。WebSocket 是一种在客户端和服务器之间实现实时双向通信的协议,常用于实现实时性要求较高的应用,如聊天应用、实时通知等,使得开发者可以更…

java系列:什么是SSH?什么是SSM?SSH框架和SSM框架的区别

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 什么是SSH?什么是SSM?SSH框架和SSM框架的区别 前言一、什么是SSH?1.1 Struts2具体工作流程:Struts2的缺点: 1.2 Sp…

【Linux】firewall防火墙配置-解决Zookeeper未授权访问漏洞

背景: zookeeper未授权访问漏洞,进行限制访问,采用防火墙访问策略 配置步骤: ##查看firewall配置清单 firewall-cmd --list-all ##查到为关闭态,启动防火墙 systemctl start firewalld ## 添加端口,这里…

Python入门06布尔值

目录 1 什么是布尔值2 怎么生成布尔值3 在控制程序中使用布尔值4 数据过滤、排序和其他高级操作总结 1 什么是布尔值 首先我们要学习一下布尔值的定义,布尔值是一种数据类型,它只有两个可能的值:True(真)或 False&…

rabbitmq消息队列实验

实验目的:实现异步通信 实验条件: 主机名 IP地址 组件 test1 20.0.0.10 rabbitmq服务 test2 20.0.0.20 rabbitmq服务 test3 20.0.0.30 rabbitmq服务 实验步骤: 1、安装rabbitmq服务 2、erlang进入命令行,查看版本 …

瑜伽学习零基础入门,各种瑜伽教学方法全集

一、教程描述 练习瑜伽的好处多多,能够保证平衡健康的身体基础,提升气质、塑造形体、陶冶情操,等等。本套教程是瑜伽的组合教程,共由33套视频教程组合而成,包含了塑身纤体,速效瘦身,四季养生&a…

双通道 H 桥 5V 4A驱动芯片

SS6951A 为电机一体化应用提供一种双通道集成电机驱动方案。SS6951A 有两路 H 桥驱动,每个 H 桥可提供最大峰值电流 4.0A,可驱动两个刷式直流电机,或者一个双极步进电机,或者螺线管或者其它感性负载。双极步进电机可以以整步、2 细…

字节大佬整理测试用例编写规范

目录 1.1目的 1.2使用范围 二 测试用例编写原则 2.1系统性 2.2连贯性 2.3全面性 2.4正确性 2.5符合正常业务惯例 2.6仿真性 2.7容错性(健壮性) 三 测试用例设计方法 3.1 等价类划分法: 3.2 边界值分析法: 3.3 因果图…

Nginx基线检查

扩展知识: Nginx主配置文件:/etc/nginx/nginx.conf 这是Nginx的主要配置文件,用于配置全局的设置、HTTP块、事件处理、邮件等内容。 打开并编辑配置文件 vim /etc/nginx/nginx.conf 一、关于禁止显示服务器版本号和操作系统版本信息: 简介: 在错误页面和响应头中显示…

多路转接<select>和<poll>使用手册

select int select(int nfds, fd_set *readfds, fd_set *writefds,fd_set *exceptfds, struct timeval *timeout); 参数说明 返回值 返回值>0 表示成功返回可访问的文件描述符个数&#xff0c;返回值0 表示标识等待时间到期返回值<0 表示出现错误…

[蓝桥杯习题]———位运算、判断二进制1个数

⭐Hello!这里是欧_aita的博客。 ⭐今日语录&#xff1a;行动胜过一切。 ⭐个人主页&#xff1a;欧_aita ψ(._. )>⭐个人专栏&#xff1a; 数据结构与算法&#xff08;内含蓝桥杯习题&#xff09; MySQL数据库 位运算 位运算位运算的定义简单运用 实战刷题题目思路代码实现声…

Apipost推出IDEA插件,代码写完直接调试

IDEA是一款功能强大的集成开发环境&#xff08;IDE&#xff09;&#xff0c;它可以帮助开发人员更加高效地编写、调试和部署软件应用程序。我们在编写完接口代码后需要进行接口调试等操作&#xff0c;一般需要打开额外的调试工具。 今天给大家介绍一款IDEA插件&#xff1a;Api…

嵌入式数据传输及存储的C语言实现

各种类型的数据传输和存储就涉及到大小端的问题&#xff0c;首先要简单说下芯片的大小端问题&#xff0c;这里主要讨论Cortex-M内核。 M内核支持大端或者小端&#xff0c;实际应用中大部分内核都是小端。以STM32为例&#xff0c;全部都是小端&#xff0c;而且是芯片设计之初就固…