day35-数据结构力扣

121. 买卖股票的最佳时机

题目链接121. 买卖股票的最佳时机 - 力扣(LeetCode)

思路

动规五步曲

1. dp 数组含义

  • dp[i][0]:第 i持有股票的最大现金

  • dp[i][1]:第 i不持有股票的最大现金

2. 递推公式

  • 持有股票:要么之前就持有,要么今天第一次买入dpi0=max(dpi−10,−pricesi)

  • 不持有股票:要么之前就不持有,要么今天卖出dpi1=max(dpi−11, dpi−10+pricesi)

3. 初始化

第一天:dp00=−prices0,dp01=0

4. 遍历顺序

从前往后遍历每一天。

5. 结果

最后一天不持有股票的最大值:dpn−11

提交

python 复制代码
class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        n = len(prices)
        if n == 0:
            return 0
        
        # dp[i][0]:第i天持有股票
        # dp[i][1]:第i天不持有股票
        dp = [[0] * 2 for _ in range(n)]
        
        # 初始化第0天
        dp[0][0] = -prices[0]   # 第一天买入
        dp[0][1] = 0            # 第一天不买入
        
        for i in range(1, n):
            # 持有:保持之前持有 / 当天新买入
            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[-1][1]

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

题目链接 122. 买卖股票的最佳时机 II - 力扣(LeetCode)

思路

跟上一道题区别就是可以无限次交易

动规五步曲

1. dp 数组定义

  • dpi0:第 i 天持有股票的最大利润

  • dpi1:第 i 天不持有股票的最大利润

2. 递推公式

  • 持有股票:

    前一天就持有;前一天不持有,当天买入dpi0=max(dpi−10, dpi−11−pricesi)

  • 不持有股票:

    前一天就不持有;前一天持有,当天卖出dpi1=max(dpi−11, dpi−10+pricesi)

3. 初始化

第 0 天:dp00=−prices0,dp01=0

4. 遍历顺序

从前到后依次遍历每一天

5. 最终结果

最后一天不持有股票:dp−11

提交

python 复制代码
class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        n = len(prices)
        if n == 0:
            return 0
        
        # dp[i][0]:第i天持有股票
        # dp[i][1]:第i天不持有股票
        dp = [[0] * 2 for _ in range(n)]
        
        # 初始化第一天
        dp[0][0] = -prices[0]   # 第一天买入
        dp[0][1] = 0            # 第一天不操作
        
        for i in range(1, n):
            # 当天持有:之前持有 / 当天新买
            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[-1][1]

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

题目链接 123. 买卖股票的最佳时机 III - 力扣(LeetCode)

思路

动规 5 步曲

1. dp 数组定义

一天有5 种状态

  • dp[i][0]:第 i 天,无操作

  • dp[i][1]:第 i 天,第一次持有股票

  • dp[i][2]:第 i 天,第一次卖出完成

  • dp[i][3]:第 i 天,第二次持有股票

  • dp[i][4]:第 i 天,第二次卖出完成

2. 递推公式

第一次持有:之前就持有 / 当天第一次买入dpi1=max(dpi−11, dpi−10−pricesi)

第一次卖出:之前已卖出 / 当天卖出第一次dpi2=max(dpi−12, dpi−11+pricesi)

第二次持有:之前二次持有 / 第一次卖完再买dpi3=max(dpi−13, dpi−12−pricesi)

第二次卖出:之前二次卖出 / 当天卖出第二次dpi4=max(dpi−14, dpi−13+pricesi)

3. 初始化

复制代码
dp[0][0] = 0
dp[0][1] = -prices[0]
dp[0][2] = -∞
dp[0][3] = -∞
dp[0][4] = -∞

4. 遍历顺序

从前往后遍历每一天

5. 结果

答案:max(dpn−12, dpn−14)(可以只做 1 笔、也可以做 2 笔)

股票三道题联动记忆:

  • 只能 1 次:买入只能用 -prices[i]

  • 无限次:买入用 前一天卖出状态-价格

  • 最多 2 次:增加二次交易状态拆分

提交

python 复制代码
class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        n = len(prices)
        if n == 0:
            return 0
        
        # 5个状态:0无操作 1第一次持有 2第一次卖出 3第二次持有 4第二次卖出
        dp = [[0] * 5 for _ in range(n)]
        INF = float("inf")
        
        # 初始化第0天
        dp[0][0] = 0
        dp[0][1] = -prices[0]
        dp[0][2] = -INF
        dp[0][3] = -INF
        dp[0][4] = -INF
        
        for i in range(1, n):
            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])
        
        # 最多两笔,取完成1笔 / 完成2笔的最大值,不能为负
        return max(dp[-1][2], dp[-1][4], 0)
相关推荐
wabs66620 分钟前
关于图论【A*算法 | 卡码网127.骑士的攻击的思考】
数据结构·算法·图论·卡码网·广搜的改进版
CIO_Alliance27 分钟前
AI认知系列(3)| 数据、算法、算力、场景四要素协同
人工智能·算法·ipaas·系统集成·企业cio联盟·企业级ai化转型
凉茶钱30 分钟前
【数据结构】堆的应用
c语言·数据结构
Forever Nore1 小时前
LeetCode 13 罗马数字转整数 - 按规则处理
linux·服务器·leetcode
..Dauntless..2 小时前
手写vector vs std::vector:从功能正确到性能达标
算法
间歇性努力持续性发呆的野生快乐选手2 小时前
栈的性质(进栈,出栈,访问)
数据结构·c++
m0_547486662 小时前
《数据结构与算法》全套PPT课件2026(中国海洋大学)
数据结构·算法
旖旎夜光2 小时前
LeetCode 904:水果成篮(滑动窗口) —— 题解
数据结构·c++·算法·leetcode·滑动窗口
怪奇云呼军3 小时前
G.711、Opus 和重采样会拖慢识别吗?闪电智能VoiceAgent 的音频入口怎么选
java·人工智能·python·算法·云计算·音视频
ZC跨境爬虫3 小时前
LeetCode 27. 移除元素(双指针详解 + Java Python 多解法对比)
java·python·leetcode