力扣算法刷题 Day 41(买卖股票)

121 买卖股票的最佳时机

题目链接

添加链接描述

思路

dp五部曲:

  1. dp数组含义:dp[i][0]表示第i天不持有股票的最多现金,dp[i][1]表示第i天持有股票的最多现金
  2. 递推:dp[i][0] = max(dp[i-1][0],dp[i-1][1] + price[i]);dp[i][1] = max(dp[i-1][1],-price[i]) 注意:只能买卖一次
  3. 初始化:dp[0][0] = 0,dp[0][1] = -price[0]
  4. 遍历方向:从左到右
  5. 模拟:
文章详解

添加链接描述

cpp 复制代码
class Solution {
public:
    int maxProfit(vector<int>& prices) {
        if(prices.size()== 0)
        {
            return 0;
        }
        vector<vector<int>> dp(prices.size(),vector<int>(2));
        dp[0][0] = 0; dp[0][1] = -prices[0];
        for(int i = 1; i < prices.size();i++)
        {
            dp[i][0] = max(dp[i-1][0],dp[i-1][1] + prices[i]);
            dp[i][1] = max(dp[i-1][1],-prices[i]); //只能买一次
        }
        return dp[prices.size() - 1][0];

    }
};

122 买卖股票II

题目链接

添加链接描述

思路

与上一道题相比,递推式发生变化:

·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]

文章详解

添加链接描述

cpp 复制代码
class Solution {
public:
    int maxProfit(vector<int>& prices) {
        // int result = 0;
        // for(int i = 1; i < prices.size();i++)
        // {
        //     result += max(prices[i]-prices[i-1],0);
        // }
        // return result;
        if(prices.size()== 0)
        {
            return 0;
        }
        vector<vector<int>> dp(prices.size(),vector<int>(2));
        dp[0][0] = 0; dp[0][1] = -prices[0];
        for(int i = 1; i < prices.size();i++)
        {
            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[prices.size() - 1][0];
    }
};

123 买卖股票III

题目链接

添加链接描述

思路

需要再加一个维度k,表示当前操作位于第一周期还是第二周期。dp五部曲:

  1. dp数组含义:dp[i][0][k]表示第i天不持有股票第k周期(k<2)的最大现金,dp[i][1][k]表示第i天持有股票第k周期(k<2)的最大现金
  2. 递推: dp[i][0][0] = dp[i-1][0][0],dp[i][0][1] = max(dp[i-1][0][1],dp[i-1][1][0] + price[i]),dp[i][1][0] = max(dp[i-1][1][0],-prices[i]),dp[i][1][1] = max(dp[i-1][1][1],dp[i-1][0][1] - prices[i]),dp[i][0][2] = dp[i][1][1] + prices[i]
  3. 初始化:dp000 = 0,dp010 = -prices0, dp001 = 0, dp011 = -prices0 dp002 = 0
  4. 遍历顺序:从左到右
  5. 模拟递推:略
文章详解

添加链接描述

cpp 复制代码
class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int n = prices.size();
        if (n == 0) return 0;

        vector<vector<vector<int>>> dp(n, vector<vector<int>>(2, vector<int>(3, 0)));

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

        for (int i = 1; i < n; i++) {
            dp[i][0][0] = dp[i - 1][0][0];
            dp[i][1][0] = max(dp[i - 1][1][0], -prices[i]);

            dp[i][0][1] = max(dp[i - 1][0][1], dp[i - 1][1][0] + prices[i]);
            dp[i][1][1] = max(dp[i - 1][1][1], dp[i - 1][0][1] - prices[i]);

            dp[i][0][2] = max(dp[i - 1][0][2], dp[i - 1][1][1] + prices[i]);
        }

        return dp[n - 1][0][2];
    }
};
相关推荐
普通攻击往后拉4 小时前
Leetcode 206. 反转链表
算法·leetcode·链表
@syh.5 小时前
【贪心】矩阵消除游戏
算法·游戏·矩阵
可编程芯片开发5 小时前
基于零极点配置的PID控制系统simulink建模与仿真
算法
徐小夕5 小时前
开源!我用SQLite + DuckDB打造了一款可视化AI问数平台
前端·算法·github
Hrain-AI6 小时前
2026 企业 AI 智能体平台横评:8 大主流平台 7 维度实测对比
人工智能·算法·机器学习
Angel Q.7 小时前
因子分析和生成模型有什么关系?从“幕后因素”到“生成数据”
算法
咩咩啃树皮8 小时前
第52篇:前端工程化完整体系精讲——Vite构建、模块化、打包原理、规范体系、面试终极通关
前端·面试·职场和发展
FBI HackerHarry浩8 小时前
AI大模型开发V2第四阶段线性回归
人工智能·算法·线性回归
Jerry9 小时前
LeetCode 108. 将有序数组转换为二叉搜索树
算法