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

news2024/9/24 23:02:16

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

用动归去解决

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

  • 不持有股票
  • 持有股票

那我们最后只有返回两种状态下的最大利润就可以了,有时候想不明白可以先想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 0
    rst = [[0, 0]] * days
    rst[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 = 0
    for i in range(1, len(prices)):
        rst += max(0, prices[i] - prices[i - 1])
    return rst

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

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

相关文章

BootStrap完整页面尝试(感兴趣的同学可以做)

试采用BootStrap技术或者htmlcss,完成以下页面。 题目为选做,有兴趣的同学可以尝试。

货代FOB条款卖方必备的知识:发货人都要承担哪些费用呢?

据统计,中国出口中以FOB成交的占到70%,但专家指出:FOB对出口商的风险更大,有可能造成货、款两空的结局。 目前我国出口合同以FOB价格条款成交的比例越来越大,而且收货人指定船公司的少,指定境外货代的多&am…

从原理和公式出发:python实现One_Way_ANOVA

文章目录 目的:python实现one way ANOVA 单因素方差分析1. 代码流程2. python代码实现0 主要的函数1 加载数据2 查看数据统计结果3 数据处理及可视化4 方差分析4.1 模型拟合4.2 单因素方差分析 5 Post Hoc t-test组间比较分析6 根据定义自行分解计算对比调用函数的结…

Docker容器镜像、Docker运行时用户空间和Linux内核之间的关系介绍

☞ ░ 前往老猿Python博客 ░ https://blog.csdn.net/LaoYuanPython 一、引言 我们都知道,运行的容器就是一个独立的Linux进程,当通过docker run 指令运行一个Docker容器时,首先找到镜像文件,然后根据镜像的配置信息&#xff0c…

Python协程技术:从Greenlet到async/await的异步编程探索

协程: ​ 协程,在Python中,协程是一种轻量级的并发编程方式,它允许在单个线程内实现多个独立的执行流。协程可以在不同的执行点之间进行切换,而无需依赖于操作系统的线程切换。这使得协程成为处理高并发和异步任务的有…

大语言模型新升级:亚马逊云科技2023芯片创新日

在这个充满活力的2023年芯片创新日,Amazon EC2 的副总裁 Dave Brown 与观众分享了他与 EC2 的15年漫长旅程。他的眼中闪烁着对技术的热情,他描述了自己如何与一个才华横溢的团队合作,在这大语言模型与生成式AI的元年中致力于为客户提供最佳的…

Python基础语法之学习字符串快速格式化

Python基础语法之学习字符串快速格式化 一、代码二、效果 一、代码 # 通过f"{占位}"控制字符串快速格式化,不做精度控制 name "张三" age 13 money 12.5 text f"姓名是{name},年龄是{age},钱是{money}" print(text)二、效果 每一天都是一个…

Codeforces Round 906 (Div. 2)(D推公式 E1分类讨论区间 E2 dp+线段树)

A - Doremys Paint 3 推公式得 b1b3b5b7.... b2b4b6b8... 所以如果只有一个数或者两个数且数量差小于等于1即可 #include<bits/stdc.h> using namespace std; const int N 2e510,mod1000003; #define int long long typedef long long LL; typedef pair<int, in…

idea类和方法模版

类模版 修改目标位置 class #if (${PACKAGE_NAME} && ${PACKAGE_NAME} ! "")package ${PACKAGE_NAME};#end #parse("File Header.java")/*** ${Description}* author whc ${YEAR}/${MONTH}/${DAY}* version v1.0 */public class ${NAME} { }inte…

#HarmonyOS:软件安装

软件地址 https://developer.harmonyos.com/cn/develop/deveco-studio#download 安装的建议 这个界面这样选&#xff0c;其他界面全部按照默认路径往下走&#xff01;&#xff01;&#xff01; 等待安装… 安装环境错误处理 一般就是本地node配置一场导致&#xff0c;建议…

在Pycharm中创建项目新环境,安装Pytorch

在python项目中&#xff0c;很多项目使用的各类包的版本是不一致的。所以我们可以对每个项目有专属于它的环境。所以这个文章就是教你如何创建新环境。 一、创建新环境 首先我们需要去官网下载conda。然后在Pycharm下面添加conda的可执行文件。 用conda创建新环境。 二、…

Netfilter中的NAT

目录 前瞻 SNAT和DNAT SNAT DNAT 实验 前瞻 NAT: &#xff08;network address translation&#xff09;&#xff0c;支持PREROUTING&#xff0c;INPUT&#xff0c;OUTPUT&#xff0c;POSTROUTING四个链 NAT分为SNAT和DNAT SNAT&#xff1a;支持POSTROUTING, INPUT&…

Java封装讯飞星火大模型历险记

问题描述与分析 现状描述与目标 在使用讯飞星火大模型API的过程中&#xff0c;API的返回结果在可以在其他线程中进行分次打印&#xff0c;但是在main方法中直接打印返回结果&#xff0c;显示为空。这种情况下不利于二次封装&#xff0c;希望在main方法中获取完整的API返回结果…

POE浪涌保护器+POE防雷器综合解决方案

POE&#xff08;Power over Ethernet&#xff0c;以太网供电&#xff09;是一种利用双绞线以太网布线同时传输电力和数据的技术&#xff0c;目前常用于智能安防摄像系统、无线局域网、物联网等领域。POE技术可以简化网络设备的布线和安装&#xff0c;降低成本和维护难度&#x…

文献速递:机器学习在超声波非破坏性评估中的合成和增强训练数据综述(第一部分)— (机器学习方法在超声波检测中的概述)

文献速递&#xff1a;机器学习在超声波非破坏性评估中的合成和增强训练数据综述&#xff08;第一部分&#xff09;— &#xff08;机器学习方法在超声波检测中的概述&#xff09; Title 题目 A review of synthetic and augmented training data for machine learning in ul…

python用YOLOv8对图片进行分类

用yolov8的模型进行分类 先上效果图 图片资源 模型下载地址 https://github.com/ultralytics/ultralytics 代码 import matplotlib.pyplot as plt from ultralytics import YOLO from PIL import Image import cv2model YOLO(../ultralytics/yolov8n.pt)# print(model…

代码随想录算法训练营第四十八天【动态规划part09】 | 198.打家劫舍、213.打家劫舍II、337.打家劫舍III

198.打家劫舍 题目链接&#xff1a; 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 求解思路&#xff1a; 当前房屋偷与不偷取决于前一个房屋是否被偷了 动规五部曲 确定dp数组及其下标含义&#xff1a;考虑下标i&#xff08;包括i&#xff09…

Nginx(无法解析PHP网页如何解决?FPM解决你的烦恼!)

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a; 小刘主页 ♥️不能因为人生的道路坎坷,就使自己的身躯变得弯曲;不能因为生活的历程漫长,就使求索的 脚步迟缓。 ♥️学习两年总结出的运维经验&#xff0c;以及思科模拟器全套网络实验教程。专栏&#xff1a;云计算技…

新建的springboot项目中application.xml没有绿色小叶子(不可用)

经常有朋友会遇到新建了一个springboot项目&#xff0c;发现为啥我创建的application.xml配置文件不是绿色的&#xff1f;&#xff1f;&#xff1f; 下面教大家如何解决&#xff0c;这也是博主在做测试的时候遇到的&#xff1a; 将当前位置application.xml删掉&#xff0c;重新…

RF实现数据驱动DDT

场景 在自动化测试框架中&#xff0c;数据驱动的意思指定的是测试用例或者说测试套件是由外部数据集合来驱动的框架。这里说的数据集可以是任何类型的数据文件比如xls&#xff0c;xlsx&#xff0c;csv等等。它的核心的思想就是数据和测试代码分离&#xff0c;及时当测试数据发…