LeetCode 121 & 122:股票买卖问题(DP 对比题解)✅

LeetCode 121 & 122:股票买卖问题(DP 对比题解)✅

📌 题目列表

题号 题目 限制
121 买卖股票的最佳时机I 只能交易 1 次
122 买卖股票的最佳时机II 可以交易 无限次

📖 内容概要

给定一个数组 prices,其中 prices[i] 是第 i 天的股票价格。

你需要选择 买入和卖出时机,使利润最大。

  • 121:只能买卖一次
  • 122:可以多次买卖(同一天不能同时买卖)

✅ 动态规划

✅ 状态机思想

✅ 面试高频题


💡 统一 DP 定义(两题通用)

java 复制代码
dp[i][0] = 第 i 天结束时,不持有股票的最大利润
dp[i][1] = 第 i 天结束时,持有股票的最大利润

🔁 状态转移(核心)

不持有股票 dp[i][0]

java 复制代码
dp[i][1] = max(
    前一天就不持有,
    前一天持有 + 今天卖出
)

✅ 两题 完全一致


持有股票 dp[i][1]

题目 转移方程 含义
121 max(dp[i-1][1], -prices[i]) 只能买一次
122 max(dp[i-1][1], dp[i-1][0] - prices[i]) 可以反复买

这是两道题的唯一区别


✅ 121 题:只能买卖一次(AC 代码)

java 复制代码
class Solution {
    public int maxProfit(int[] prices) {
        int len = prices.length;
        int[][] dp = new int[len][2];

        dp[0][0] = 0;           // 不持股
        dp[0][1] = -prices[0]; // 持股

        for (int i = 1; i < len; i++) {
            dp[i][0] = Math.max(dp[i - 1][0], dp[i - 1][1] + prices[i]);
            dp[i][1] = Math.max(dp[i - 1][1], -prices[i]); // 只能买一次
        }
        return dp[len - 1][0];
    }
}

✅ 关键点

  • 第二次买入时:
    • 之前不能有利润
    • 只能是 -prices[i]

✅ 122 题:可以无限交易(AC 代码)

java 复制代码
class Solution {
    public int maxProfit(int[] prices) {
        int len = prices.length;
        int[][] dp = new int[len][2];

        dp[0][0] = 0;
        dp[0][1] = -prices[0];

        for (int i = 1; i < len; i++) {
            dp[i][0] = Math.max(dp[i - 1][0], dp[i - 1][1] + prices[i]);
            dp[i][1] = Math.max(dp[i - 1][1], dp[i - 1][0] - prices[i]);
        }
        return dp[len - 1][0];
    }
}

✅ 关键点

  • 再次买入时:
    • 使用的是 之前不持股的最大利润

🔍 两题核心差异对比

对比项 121(一次) 122(无限次)
是否可多次买卖
持有状态转移 -prices[i] dp[i-1][0] - prices[i]
DP 含义 第一次买入 任意次买入
难度 中等 简单

⏱️ 复杂度分析

指标 复杂度
时间复杂度 O(n)
空间复杂度 O(n)(可优化为 O(1))

🚀 空间优化(通用)

java 复制代码
int hold = -prices[0];
int cash = 0;

for (int i = 1; i < prices.length; i++) {
    int prevCash = cash;
    cash = Math.max(cash, hold + prices[i]);
    hold = Math.max(hold, prevCash - prices[i]);
}
return cash;

✅ 一句话总结

121 限制"只能买一次",122 允许"反复买卖",区别仅在于持有股票的转移方程。

相关推荐
血色橄榄枝2 小时前
基于用户注册信息的关键词检测挑战赛「Datawhale AI 夏令营」
人工智能·算法·机器学习
c238563 小时前
第二篇:《测试指挥官:可视化单题自测框架(含 assert 实操)》
java·数据库·c++·算法·安全性测试
六点_dn4 小时前
Linux学习笔记-printf命令
linux·运维·算法
遥感知识服务5 小时前
Sentinel-1 + DEM + FwDET + 随机森林:从快速水深初估到多因子误差修正
算法·随机森林·sentinel
来一碗刘肉面5 小时前
顺序表与链表的比较
数据结构·算法·链表
alphaTao5 小时前
LeetCode 每日一题 2026/7/13-2026/7/19
算法·leetcode
nnerddboy5 小时前
脑电信号处理实战 03 | 运动想象脑机接口入门:ERD/ERS、CSP 空间滤波与左右拳想象解码
算法·信号处理
QN1幻化引擎6 小时前
Dalin L — 我造了一门支持中文编程的语言,完整移植到 Rust 了
人工智能·算法·机器学习
Rainy Blue8836 小时前
C转C++速成
c语言·c++·算法
txzrxz7 小时前
二分图详解
数据结构·c++·算法·图论·深度优先搜索·二分图染色