leetcode刷题-动态规划08

news/2025/2/26 5:57:13/

代码随想录动态规划part08|121. 买卖股票的最佳时机、122.买卖股票的最佳时机II、123.买卖股票的最佳时机III

    • 121.买卖股票的最佳时机
    • 122.买卖股票的最佳时机II
    • 123.买卖股票的最佳时机III -- 困难

121.买卖股票的最佳时机

leetcode题目链接
代码随想录文档讲解

思路

本题这一只股票只买卖一次
暴力解法、动态规划解法
动态规划

  1. dp数组的含义:
    要用二维dp数组:dp[i][0], dp[i][1]分别表示持有这只股票所得的最大现金和不持有这支股票的最大现金(刚开始手里的钱数为0,那最终的钱数就是利润)。
    最终返回max(dp[len(nums-1)][0], dp[len(nums)-1][1]),其实是返回dp[len(nums)-1][1],因为最后一天不持有股票手里的现金才会多
  2. 递推公式:
    a. dp[i][0](第i天已经持有这只股票,可能是之前就持有,也可能是今天才买入持有)
    dp[i][0] = max(dp[i-1][0], -price[i]) (这里负数的max就是花费最少,当前手里的现金肯定是负数)
    b. dp[i][1](第i天已经不持有这只股票,可能是之前就卖了,也可能是今天才卖掉这只股票)
    dp[i][1] = max(dp[i-1][1], dp[i-1][0]+price[i])
    c. 思路比较不寻常,注意别想复杂了,准
  3. dp数组初始化:
    dp[0][0] = -price[0]
    dp[0][1] = 0
  4. 遍历顺序:从前往后遍历,不涉及背包中复杂的遍历顺序

python代码

class Solution:def maxProfit(self, prices: List[int]) -> int:dp = [[0,0] for _ in range(len(prices)+1)]# dp = [[0] * 2 for _ in range(length)]dp[0][0] = -prices[0]dp[0][1] = 0for 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])   return dp[len(prices)-1][1]      

以前的提交:贪心算法

class Solution:def maxProfit(self, prices: List[int]) -> int:maxprofit = 0mincost = 90000for i in range(len(prices)):if prices[i]<mincost:mincost = prices[i]maxprofit = max(maxprofit, prices[i]-mincost)return maxprofit

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

leetcode题目链接
代码随想录文档讲解

思路

可用贪心法,本题相比上题改为:可买卖多次

贪心算法
可买卖多次,第i天买入股票手头上的现金不是0,可能是之前买卖多次获得的利润,所以在递推公式中dp[i][0]需要改变
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])

python代码

class Solution:def maxProfit(self, prices: List[int]) -> int:dp = [[0]*2 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]

123.买卖股票的最佳时机III – 困难

leetcode题目链接
代码随想录文档讲解

思路

本题最多可以完成两笔交易,不能同时参与多笔交易

  1. dp数组定义
    dp[i][0] 不操作(没有持有过)
    dp[i][1] 第一次持有(第一次买入或者延续了前些天买入后持有的状态)
    dp[i][2] 第一次不持有 (已经卖出了)
    dp[i][3] 第二次持有
    dp[i][4] 第二次不持有
  2. 递推公式
    dp[i][0] = dp[i-1][0]
    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])
    dp[i][4] = max(dp[i-1][4], dp[i-1][3]+prices[i])
  3. 初始化
    dp[0][0] = 0
    dp[0][1] = -prices[0]
    dp[0][2] = 0
    dp[0][3] = -prices[0]
    dp[0][4] = 0
  4. 遍历顺序

python代码

class Solution:def maxProfit(self, prices: List[int]) -> int:dp = [[0]*5 for _ in range(len(prices))]dp[0][1], dp[0][3] = -prices[0], -prices[0]for i in range(1, len(prices)):dp[i][0] = dp[i-1][0]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])dp[i][4] = max(dp[i-1][4], dp[i-1][3]+prices[i])return dp[len(prices)-1][4] 

本题可以不用维护一个dp数组,只用4个变量即可(状态压缩)

class Solution:def maxProfit(self, prices: List[int]) -> int:if len(prices) == 0:return 0dp = [0] * 5 dp[1] = -prices[0]dp[3] = -prices[0]for i in range(1, len(prices)):dp[1] = max(dp[1], dp[0] - prices[i])dp[2] = max(dp[2], dp[1] + prices[i])dp[3] = max(dp[3], dp[2] - prices[i])dp[4] = max(dp[4], dp[3] + prices[i])return dp[4]

http://www.ppmy.cn/news/1574958.html

相关文章

从单片机的启动说起一个单片机到点灯发生了什么下——使用GPIO点一个灯

目录 前言 HAL库对GPIO的抽象 核心分析&#xff1a;HAL_GPIO_Init 前言 我们终于到达了熟悉的地方&#xff0c;对GPIO的初始化。经过漫长的铺垫&#xff0c;我们终于历经千辛万苦&#xff0c;来到了这里。关于GPIO的八种模式等更加详细的细节&#xff0c;由于只是点个灯&am…

谈谈 ES 6.8 到 7.10 的功能变迁(2)- 字段类型篇

我们继续来了解一下从 ES 6.8 到 ES 7.10 新增的功能。本篇主要介绍新增的字段类型&#xff0c;会简要概述一下新增字段类型的使用场景和限制&#xff0c;提供简单的测试代码。 Flattened 扁平化对象字段 功能说明 解决场景 该功能主要用于处理具有大量不确定键的 JSON 对象…

常见排序算法以及实现

在本文中&#xff0c;所有排序算法考虑的都是升序情况。只要我们能搞懂算法原理&#xff0c;逆序也是很容易就能实现的。所有的排序算法的代码&#xff0c;都可以在下面这道题中测试。&#xff08;当然有些排序实现的结果会导致不能AC&#xff0c;但并不能说明是错的&#xff0…

linux 里vi编辑器的使用

Vi 编辑器的三种模式及关系 Vim 是 Linux 系统中常用的文本编辑器&#xff0c;它有三种主要模式&#xff1a;命令模式、插入模式和底线模式。这三种模式之间相互切换&#xff0c;用于不同的编辑操作。 1. 命令模式&#xff08;Command Mode&#xff09; 特点&#xff1a; 默认…

【Python爬虫(44)】分布式爬虫:筑牢安全防线,守护数据之旅

【Python爬虫】专栏简介&#xff1a;本专栏是 Python 爬虫领域的集大成之作&#xff0c;共 100 章节。从 Python 基础语法、爬虫入门知识讲起&#xff0c;深入探讨反爬虫、多线程、分布式等进阶技术。以大量实例为支撑&#xff0c;覆盖网页、图片、音频等各类数据爬取&#xff…

洛谷每日1题-------Day1__超级玛丽游戏

# P1000 超级玛丽游戏 ## 题目背景 本题是洛谷的试机题目&#xff0c;可以帮助了解洛谷的使用。 建议完成本题目后继续尝试 [P1001](/problem/P1001)、[P1008](/problem/P1008)。 另外强烈推荐[新用户必读贴](/discuss/show/241461) ## 题目描述 超级玛丽是一个非常经典…

lua垃圾回收机制

文章目录 前言一、垃圾回收机制概述二、底层原理三、GC 控制与调优四、GC 的局限性总结 前言 Lua 的垃圾回收&#xff08;Garbage Collection, GC&#xff09;机制是一种自动内存管理技术&#xff0c;主要基于标记-清除&#xff08;Mark-and-Sweep&#xff09;算法&#xff0c…

【Gin-Web】Bluebell社区项目梳理6:限流策略-漏桶与令牌桶

本文目录 一、限流二、漏桶三、令牌桶算法四、Gin框架中实现令牌桶限流 一、限流 限流又称为流量控制&#xff0c;也就是流控&#xff0c;通常是指限制到达系统的并发请求数。 限流虽然会影响部分用户的使用体验&#xff0c;但是能一定程度上保证系统的稳定性&#xff0c;不至…