代码随想录算法训练营第四十天 | 股票问题

LeetCode 121.买卖股票的最佳时机:

文章链接
题目链接:121.买卖股票的最佳时机

思路

方法1:暴力

看到题目最直接的想法是双层遍历求最大区间差

class Solution:def maxProfit(self, prices):if len(prices) <= 1:return 0result = 0for i in range(len(prices)):for j in range(i + 1, len(prices)):result = max(result, prices[j] - prices[i])return result

这种方法的时间复杂度为O(n^2),会超时

方法2:贪心

一次遍历,向左求最小值,向右求最大值,再用求得的两个值求差。
或者,也可以这样,一次遍历过程中,更新最小值,同时更新 result 为max(prices[i] - 最小值,result)。

class Solution:def maxProfit(self, prices: List[int]) -> int:if len(prices) <= 1:return 0low, result = float('inf'), 0for price in prices:low = min(low, price)   # 向左找最小值result = max(result, price - low)   # 直接取最大区间利益return result
方法3:动态规划

因为需要考虑是否买入股票和卖出股票,所以对应的dp数组为二维数组,分别保存当前持有股票和没持有股票得到的利润(持有可能是之前买入了,不一定是当前买入)
动规五部曲:

  • dp数组及含义:
    dp[i][0]表示当前持有股票的利润,dp[i][1]表示当前没持有股票所获得的利润。
    可以理解最开始现金为0,因此持有股票时,利润为 - prices[j],即股票价格的负数
  • 递推公式:
    dp[i][0]的来源:
    ① 上一天持有股票,dp[i - 1][0]
    ② 上一天不持有股票,今天买入了股票,-prices[i]
    因为是获取的最大利润,所以是求max(也可以理解上面这个过程是在求最低的股票价格)
    dp[i][1]的来源:
    ① 上一天持有股票,今天卖出去了,利润为prices[i] + dp[i - 1][0]([0]是负的)
    ② 上一天不持有股票,利润为dp[i - 1][1]
    也是求max
  • 初始化
    由递推公式可知,dp[i]只与dp[i - 1]有关,因此初始化dp[0],第1天持有股票,只可能是第1天买入,dp[0][0] = -prices[0],第1天不持有股票,利润自然是0,dp[0][1] = 0
  • 遍历顺序
    从前往后
  • 举例
    最后最大利润是dp[len - 1][1],因为dp[0]一定小于0
    在这里插入图片描述
class Solution:def maxProfit(self, prices: List[int]) -> int:if len(prices) <= 1:return 0dp = [[0,0] for _ in range(len(prices))]# 初始化dp[0][0] = -prices[0]dp[0][1] = 0# 遍历for i in range(1, len(prices)):dp[i][0] = max(dp[i - 1][0], -prices[i])dp[i][1] = max(dp[i - 1][1], prices[i] + dp[i - 1][0])return dp[-1][1]

仔细研究递推式会发现,dp[i]只与dp[i - 1]有关,因此dp数组可以缩小为2*2的数组

class Solution:def maxProfit(self, prices: List[int]) -> int:if len(prices) <= 1:return 0len_prices = len(prices)dp = [[0, 0], [0, 0]]# 初始化dp[0][0] = -prices[0]dp[0][1] = 0# 遍历for i in range(1, len_prices):dp[i % 2][0] = max(dp[(i - 1) % 2][0], -prices[i])dp[i % 2][1] = max(dp[(i - 1) % 2][1], prices[i] + dp[(i - 1) % 2][0])return dp[(len_prices - 1) % 2][1]

LeetCode 122.买卖股票的最佳时机Ⅱ:

文章链接
题目链接:122.买卖股票的最佳时机Ⅱ

思路

方法1:贪心

之前用过,基本思路是:昨天买入,今天卖出。如果亏了,就当作昨天没买入,不算入利润;赚了就算入利润。然后除最后一天外都会买入

class Solution:def maxProfit(self, prices: List[int]) -> int:if len(prices) <= 1:return 0maxprofit = 0preprice = prices[0]for price in prices[1:]:maxprofit += max(0, price - preprice)preprice = pricereturn maxprofit
方法2:动态规划:

首先弄清楚本题与上题的区别,上题是股票只有一次买入和卖出的机会,这次是股票可以经历多次买入和卖出。
动规五部曲中,dp数组及含义是相同的,递推式有不同,因为可以多次买入和卖出,因此dp[i][0]
① 昨天持有股票:dp[i - 1][0]
② 昨天没持有股票:之前的题目,如果昨天没持有股票,那么认为之前利润为0,更新的利润为 - prices[i];而这道题,昨天没有持有股票可能是昨天卖出去,已经有了一部分利润,因此为 dp[i - 1][1] - prices[i] (且上道题的递推式不能用这道题的
其余相同
举例
到最后获得最大利润一定是手上没有股票了
在这里插入图片描述

"""
也可以像上一题一样把dp变成2*2的数组,因为递推式dp[i]还是只与dp[i - 1]有关
"""
class Solution:def maxProfit(self, prices: List[int]) -> int:if len(prices) <= 1:return 0len_prices = len(prices)dp = [[0, 0] for _ in range(len_prices)]# 初始化dp[0][0] = -prices[0]   # 持有股票的利润# 遍历for i in range(1, len_prices):dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] - prices[i])  # 持有股票,注意这个地方dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] + prices[i])  # 不持有股票return dp[len_prices - 1][1]

LeetCode 123.买卖股票的最佳时机Ⅲ:

文章链接
题目链接:123.买卖股票的最佳时机Ⅲ

思路:

首先分析题目,题目要求最多可以完成两笔交易,因此在原来分是否持有的基础上,需要继续分为是第一次还是第二次。
动规五部曲:

  • dp数组及含义:
    dp[i]应当有4列,dp[i][0]为第一次持有,dp[i][1]为第一次不持有,dp[i][2]为第二次持有,dp[i][3]为第二次不持有。后面接的都是最大利润。
    注意:持有不是当天买入,之前买入,现在不卖出也是持有
  • 递推公式:
    • dp[i][0]:
      第一次持有,如果昨天持有:dp[i - 1][0];如果昨天没持有,今天买入:-prices[i](因为是第一次,所以前面没有利润)
    • dp[i][1]:
      昨天持有,今天卖出:dp[i - 1][0] + prices[i]
      昨天没持有:dp[i - 1][1]
    • dp[i][2]:
      昨天持有:dp[i - 1][2]
      昨天没持有,今天买入(第二次,之前有利润):dp[i - 1][1] - prices[i]
    • dp[i]][3]:
      昨天持有,今天卖出:dp[i - 1][2] + prices[i]
      昨天没持有:dp[i - 1][3]
      并且都是求最大值
  • 初始化:
    由递推公式可知,应当初始化dp[0],因为是第一天,只要是买入,不管第几次买入,都是-prices[0],只要是卖出,肯定是当天买入当天卖出,都是0
  • 遍历方式:
    从前往后
  • 举例
    最后求的最大利润一定是dp[-1][3]的值,判断原因如下:
    ① 如果是一次买入卖出就得到了最大值,那第二次买入卖出肯定是都是当天,因此dp[-1][1] 等于dp[-1][3]
    ② 如果是两次买入卖出得到最大值,那也就是dp[-1][3]的值
    在这里插入图片描述
class Solution:def maxProfit(self, prices: List[int]) -> int:if len(prices) <= 1:return 0# 初始化len_prices = len(prices)dp = [[0,0,0,0] for _ in range(len_prices)]dp[0][0] = dp[0][2] = -prices[0]# 遍历for i in range(1, len_prices):dp[i][0] = max(dp[i - 1][0], -prices[i])    # 第一次买入dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] + prices[i])  # 第一次卖出dp[i][2] = max(dp[i - 1][2], dp[i - 1][1] - prices[i]) # 第二次买入dp[i][3] = max(dp[i - 1][3], dp[i - 1][2] + prices[i])  # 第二次卖出return dp[len_prices - 1][3]

学习收获:

买卖股票最佳时机,重要要分析题目得到 dp[i] 有多少种状态,以及只能一次买入卖出、多次买入卖出和限定买入卖出的最大次数的递推公式(或者可以说是一次买入卖出和多次买入卖出公式的结合,区别在于买入的利润是否要加上上一次买卖股票的利润)

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

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

相关文章

秋叶大神中文版Stable Diffusion下载安装使用教程

Stable Diffusion是什么&#xff1f; StableDiffusion是一款开源的AI绘画软件&#xff0c;于2022年发布&#xff0c;由CompVis、StabilityAI和LAION的研究人员创建。该软件具有出色的图像生成功能&#xff0c;使用户能够从头开始绘制作品&#xff0c;也可以使用现有的图像进行…

1. 使用springboot做一个音乐播放器软件项目【前期规划】

背景&#xff1a; 现在大部分音乐软件都是要冲会员才可以无限常听的。对于喜欢听音乐的小伙伴&#xff0c;资金又比较紧张&#xff0c;是那么的不友好。作为程序员的我&#xff0c;也是喜欢听着歌&#xff0c;敲着代码。 最近就想做一个音乐播放器的软件&#xff0c;在内网中使…

景区民宿预约系统设计与实现(代码+数据库+LW)

摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装景区民宿预约系统软件来发挥其高效地信息处理的作用&#…

【项目实战1】五子棋游戏

目录 C语言编程实现五子棋&#xff1a;&#xff1a; game.h game.c 1.打印菜单 2.打印棋盘 3.玩家下棋 4.判断五子连珠 5.判断输赢 6.游戏运行 game.c完整源代码展示 test.c C语言编程实现五子棋&#xff1a;&#xff1a; game.h #pragma once #include<stdio.h> …

【学习路线】Python 算法(人工智能)详细知识点学习路径(附学习资源)

学习本路线内容之前&#xff0c;请先学习Python的基础知识 其他路线&#xff1a; Python基础 >> Python进阶 >> Python爬虫 >> Python数据分析&#xff08;数据科学&#xff09; >> Python 算法&#xff08;人工智能&#xff09; >> Pyth…

游戏引擎学习第77天

仓库: https://gitee.com/mrxiao_com/2d_game 回顾昨天的 bug 今天我们继续开发进度&#xff0c;进行调试昨天代码的问题&#xff0c;主要是关于如何跟踪玩家和敌人在世界中的高度位置。虽然我们做的是一款 2D 游戏&#xff0c;但我们希望能够处理多层的房间&#xff0c;玩家…

第30天:Web开发-PHP应用组件框架前端模版渲染三方插件富文本编辑器CVE审计

#知识点 1、安全开发-原生PHP-开发组件集合 2、安全开发-原生PHP-模版引擎渲染 3、安全开发-原生PHP-第三方编辑器 组件/框架 说明 [Web框架] Laravel 现代化、功能全面的框架&#xff0c;适合大多数Web应用。 Symfony 高度模块化、功能强大的框架&#xff0c;适合复杂…

with as提高sql的执行效率

实战sql with cte(UNIT_ID, UNIT_NAME, PARENT_UNIT_ID, UNIT_CODE ) as (select UNIT_ID, UNIT_NAME, PARENT_UNIT_ID , UNIT_CODEfrom HPFM_UNITunion allselect t.UNIT_ID, t.UNIT_NAME, t.PARENT_UNIT_ID, t.UNIT_CODEfrom HPFM_UNIT tjoin cte on t.PARENT_UNIT_ID cte.U…

计算机网络 (29)网络地址转换NAT

前言 网络地址转换&#xff08;Network Address Translation&#xff0c;NAT&#xff09;是计算机网络中的一种重要协议&#xff0c;它主要用于将私有IP地址转换为公共IP地址&#xff0c;以实现内部网络与外部网络之间的通信。 一、基本概念 NAT是一种在局域网&#xff08;LAN&…

Docker--Docker Volume(存储卷)

什么是存储卷&#xff1f; Docker的存储卷是一种将宿主机的本地文件系统中的某个目录与容器内部的文件系统中的某个目录建立绑定关系的机制。这种绑定关系意味着&#xff0c;当在容器的这个目录下写入数据时&#xff0c;会同步到宿主机的这个目录中&#xff1b;同样&#xff0…

STM32裸机开发转FreeRTOS教程

目录 1. 简介2. RTOS设置&#xff08;1&#xff09;分配内存&#xff08;2&#xff09;查看任务剩余空间&#xff08;3&#xff09;使用osDelay 3. 队列的使用&#xff08;1&#xff09;创建队列&#xff08;1&#xff09;直接传值和指针传值&#xff08;2&#xff09;发送/接收…

用豆包MarsCode IDE打造精美数据大屏:从零开始的指南

原标题&#xff1a;用豆包MarsCode IDE&#xff0c;从0到1画出精美数据大屏&#xff01; 豆包MarsCode IDE 是一个云端 AI IDE 平台&#xff0c;通过内置的 AI 编程助手&#xff0c;开箱即用的开发环境&#xff0c;可以帮助开发者更专注于各类项目的开发。 作为一名前端开发工…

PCB原理图的编译设置

设置步骤&#xff1a; 进入-->Project Options...&#xff0c;对照设置“致命错误”部分来设置即可

LInux单机安装Redis

1. 安装gee工具包 由于Redis是基于c语言编写的所以安装的时候需要先安装gee以及gcc的依赖,yum云用不了可以看一下这个 linux 替换yum源镜像_更换yum镜像源-CSDN博客 yum install -y gcc tcl 2. 添加redis的压缩包 3. 上传到Linux 上传到 /usr/local/src 目录、这个目录一般用于…

黄仁勋演讲总结(2种显卡,1个开源大模型,1个数据采集平台)

研发算力显卡RTX50系列&#xff0c;PC端显卡GB10&#xff0c;开源大模型Cosmos&#xff08;用于机器人和自动驾驶&#xff09;&#xff0c; Isaac GR00T&#xff08;人形机器人的数据采集平台&#xff09;。 新一代 RTX 50 系列显卡 RTX 50 系列 GPU&#xff0c;相对之前系列&a…

初学Linux电源管理

学习文档出处&#xff1a; 万字整理 | 深入理解Linux电源管理&#xff1a;万字整理 | 深入理解Linux电源管理-CSDN博客 电源管理 因为设备需要用电&#xff0c;而且设备中的各个硬件所需要的电压是不一样的。故计算机需要对硬件的电源状态管理。但是电能并不是免费的&#x…

基于开发/发布/缺陷分离模型的 Git 分支管理实践20250103

基于开发/发布/缺陷分离模型的 Git 分支管理实践 引言 在现代软件开发中&#xff0c;合理的分支管理策略是保证项目成功的关键因素之一。本文将详细介绍一种基于开发/发布/缺陷分离的 Git 分支管理模型&#xff0c;这种模型不仅能提升团队协作效率&#xff0c;还能确保代码质…

数据库回滚:大祸临头时

原文地址 什么是数据库回滚&#xff1f; 数据库技术中&#xff0c;回滚是通过撤销对数据库所做的一项或多项更改&#xff0c;将数据库返回到先前状态的操作。它是维护数据完整性和从错误中恢复的重要机制。 什么时候需要数据库回滚&#xff1f; 数据库回滚在以下几个场景中很…

1月7日星期二今日早报简报微语报早读

1月7日星期二&#xff0c;农历腊月初八&#xff0c;早报#微语早读。 1、公安部&#xff1a;已为一线民警配备执法记录仪130万余部&#xff0c;规范现场执法&#xff1b; 2、浙江提出2035年全省域基本实现共同富裕&#xff1b; 3、“汕头牛肉丸”有新标准&#xff01;1月6日起…

数据结构:时间复杂度和空间复杂度

我们知道代码和代码之间算法的不同&#xff0c;一定影响了代码的执行效率&#xff0c;那么我们该如何评判算法的好坏呢&#xff1f;这就涉及到了我们算法效率的分析了。 &#x1f4d6;一、算法效率 所谓算法效率的分析分为两种&#xff1a;第一种时间效率&#xff0c;又称时间…