首页 > 编程语言 >代码随想录算法训练营第 42 天 |LeetCode 188.买卖股票的最佳时机IV LeetCode309.最佳买卖股票时机含冷冻期 LeetCode714.买卖股票的最佳时机含手续费

代码随想录算法训练营第 42 天 |LeetCode 188.买卖股票的最佳时机IV LeetCode309.最佳买卖股票时机含冷冻期 LeetCode714.买卖股票的最佳时机含手续费

时间:2024-08-13 14:28:31浏览次数:12  
标签:买卖 持有 股票 int 最佳时机 max prices dp

代码随想录算法训练营

Day42 代码随想录算法训练营第 42 天 |LeetCode 188.买卖股票的最佳时机IV LeetCode309.最佳买卖股票时机含冷冻期 LeetCode714.买卖股票的最佳时机含手续费


目录


前言

LeetCode 188.买卖股票的最佳时机IV

讲解文档

LeetCode309.最佳买卖股票时机含冷冻期

讲解文档

LeetCode714.买卖股票的最佳时机含手续费

讲解文档


一、LeetCode 188.买卖股票的最佳时机IV

1.题目链接

LeetCode 188.买卖股票的最佳时机IV

2.思路

(1)dp[i][j] 表示当前最大现金
i: 第i天
j: 状态
0—从未持有股票
1—第一次持有股票
2—第一次卖出

2k-1 第k次持有股票
2k 第k次卖出股票
(2)状态转移
1)j是奇数 dp[i][p] = max(dp[i - 1][p], dp[i - 1][p - 1] - prices[i]);
2)j是偶数 dp[i][p] = max(dp[i - 1][p], dp[i - 1][p - 1] + prices[i]);
(3)初始化
1)j是奇数 dp[0][p] = -prices[0];
2)j是偶数 dp[0][p] = 0;

3.题解

class Solution {
public:
    int maxProfit(int k, vector<int>& prices) {
        int n = prices.size();
        int dp[n][2 * k + 2];
        for (int p = 1; p < 2 * k + 2; p += 2) {
            dp[0][p] = -prices[0];
            dp[0][p - 1] = 0;
        }
        for (int i = 1; i < n; i++) {
            dp[i][0] = 0;
            for (int p = 1; p < 2 * k; p += 2) {
                dp[i][p] = max(dp[i - 1][p], dp[i - 1][p - 1] - prices[i]);
                dp[i][p + 1] = max(dp[i - 1][p + 1], dp[i - 1][p] + prices[i]);
            }
        }
        return dp[n - 1][2 * k];
    }
};

二、LeetCode309.最佳买卖股票时机含冷冻期

1.题目链接

LeetCode309.最佳买卖股票时机含冷冻期

2.思路

1)dp[i][j] 表示当前最大现金
i: 第i天
j: 状态
0—持有股票
1—未持有股票但是可以买入
2—未持有股票但是不可以买入
(2)状态转移
1)持有股票可以是前一天持有,也可以前一天未持有股票但是可以买入
dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] - prices[i]);
2)前一天未持有股票但是可以买入,也可以前一天未持有股票但是不可以买入
dp[i][1] = max(dp[i - 1][1], dp[i - 1][2]);
3)前一天持有,今天卖出
dp[i][2] = dp[i - 1][0] + prices[i];
(3)初始化
持有股票:dp[0][0] = -prices[0];
从未持有: dp[0][1] = 0;
从未持有: dp[0][2] = 0;

3.题解

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int n = prices.size();
        int dp[n][3];
        // 0---持有 1---不持有且不在冷却期 2--冷却
        dp[0][0] = -prices[0];
        dp[0][1] = 0;
        dp[0][2] = 0;
        for (int i = 1; i < n; 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][2]);
            dp[i][2] = max(dp[i - 1][2], dp[i - 1][0] + prices[i]);
        }
        int ans = max(dp[n - 1][0], dp[n - 1][1]);
        ans = max(ans, dp[n - 1][2]);
        return ans;
    }
};

三、LeetCode714.买卖股票的最佳时机含手续费

1.题目链接

LeetCode714.买卖股票的最佳时机含手续费

2.思路

在买卖股票的最佳时机II 的基础上,每次出售时减去fee

3.题解

class Solution {
public:
    int maxProfit(vector<int>& prices, int fee) {
        int n=prices.size();
        int dp[n][2];
        dp[0][0]=-prices[0];
        dp[0][1]=0;
        for(int i=1;i<n;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]-fee);
        }
        return max(dp[n-1][0],dp[n-1][1]);
    }
};

股票问题总结

  1. 121.买卖股票的最佳时机
    dp[i][0] 表示第i天持有股票所得现金。
    dp[i][1] 表示第i天不持有股票所得现金。
  • 如果第i天持有股票即dp[i][0], 那么可以由两个状态推出来

    第i-1天就持有股票,那么就保持现状,所得现金就是昨天持有股票的所得现金 即:dp[i - 1][0]
    第i天买入股票,所得现金就是买入今天的股票后所得现金,因为此前不可能进行交易,所以从来没有持有过股票-prices[i] 所以dp[i][0] = max(dp[i - 1][0], -prices[i]);
    
  • 如果第i天不持有股票即dp[i][1], 也可以由两个状态推出来

    第i-1天就不持有股票,那么就保持现状,所得现金就是昨天不持有股票的所得现金 即:dp[i - 1][1]
    第i天卖出股票,所得现金就是按照今天股票佳价格卖出后所得现金即:prices[i] + dp[i - 1][0] 所以dp[i][1] = max(dp[i - 1][1], prices[i] + dp[i - 1][0]);
    

2.122.买卖股票的最佳时机II
(1)贪心算法:拆分利润,看成每天一买一卖,收集每天的正利润
(2)动态规划:

  • dp数组定义:

    dp[i][0] 表示第i天持有股票所得现金
    dp[i][1] 表示第i天不持有股票所得最多现金
    
  • 如果第i天持有股票即dp[i][0], 那么可以由两个状态推出来

    第i-1天就持有股票,那么就保持现状,所得现金就是昨天持有股票的所得现金 即:dp[i - 1][0]
    第i天买入股票,所得现金就是昨天不持有股票的所得现金减去 今天的股票价格 即:dp[i - 1][1] - prices[i]
    
  1. 188.买卖股票的最佳时机IV
    最多买卖k笔交易,问最大收益
    (1)dp[i][j] 表示当前最大现金
    i: 第i天
    j: 状态
    0—从未持有股票
    1—第一次持有股票
    2—第一次卖出

    2k-1 第k次持有股票
    2k 第k次卖出股票
    (2)状态转移
    1)j是奇数 dp[i][p] = max(dp[i - 1][p], dp[i - 1][p - 1] - prices[i]);
    2)j是偶数 dp[i][p] = max(dp[i - 1][p], dp[i - 1][p - 1] + prices[i]);
    (3)初始化
    1)j是奇数 dp[0][p] = -prices[0];
    2)j是偶数 dp[0][p] = 0;

4.冷却期:
三个状态:
0—持有股票
1—未持有股票但是可以买入
2—未持有股票但是不可以买入

标签:买卖,持有,股票,int,最佳时机,max,prices,dp
From: https://blog.csdn.net/2301_79647020/article/details/141162221

相关文章

  • 代码随想录day28 || 122 买卖最佳时机2,55 跳跃游戏,45 跳跃游戏2,1005 k次取反最大数组
    122买卖股票最佳时机2funcmaxProfit(prices[]int)int{ //思路,因为支持同一天买入卖出,所以利润最大应该是所有正利润的加总结果 varsumint fori:=1;i<len(prices);i++{ ifprices[i]-prices[i-1]>0{ sum+=prices[i]-prices[i-1] } } returns......
  • 计算机毕业设计Python+Tensorflow股票推荐系统 股票预测系统 股票可视化 股票数据分析
    基于Tensorflow的股票推荐与预测系统的设计与实现开题报告一、研究背景与意义在信息技术高速发展的今天,金融市场日益复杂,投资者面临着越来越多的选择和挑战。股票作为金融市场的重要组成部分,其价格波动受到多种因素的影响,包括宏观经济、政策变化、公司业绩等。因此,如何准确......
  • QCustomPlot绘制股票曲线,去除中间休市时间
    QCPAxis中增加两个函数,设置x轴的值和标签映射关系,要把中午午休的时间去掉; voidsetTickVector(QVector<double>tickVector){mTickVector=tickVector;};voidsetTickLabels(QVector<QString>tickLabel){mTickVectorLabels=tickLabel;}voidNGraph::SetXTimeLab......
  • 基于Prophet时间序列模型预测股票价格趋势
    作者:老余捞鱼原创不易,转载请标明出处及原作者。写在前面的话:     在当今复杂多变的金融市场中,股票价格预测一直是投资者和分析师关注的焦点。本文旨在利用Prophet时间序列模型对股票价格趋势进行预测。Prophet模型是一种基于可分解的时间序列模型,由趋势项、季节......
  • API 不返回扫描仪股票或帐户信息
    我使用API为盈透证券构建了一个交易机器人。但是,我既无法让它返回“TOP-PER_GAIN”,也无法从我的帐户返回可用现金。你们中的任何人都可以告诉我哪里出了问题吗?这是相关的代码。fromib_insyncimport*fromib_insyncimportIB,Stock,MarketOrderimportthreadingi......
  • *算法训练(leetcode)第三十五天 | 121. 买卖股票的最佳时机、122. 买卖股票的最佳时机 I
    刷题记录*121.买卖股票的最佳时机贪心*动态规划122.买卖股票的最佳时机II贪心*动态规划*123.买卖股票的最佳时机III*121.买卖股票的最佳时机leetcode题目地址贪心找左侧最小值、右侧最大值(与最小值求差最大),求差即为最大利润。时间复杂度:......
  • 代码随想录 day 41 买卖股票的最佳时机系列
    买卖股票的最佳时机买卖股票的最佳时机解题思路使用动态规划的思路解决,这类题目和之前做到过的所有动态规划相比有一定变化。在确定数组方面,这系列的题目都使用了二维数组来表示买卖股票的不同状态。在递归方面,本系列和小偷,背包等问题不同,它的状态递推关系也不是需要前两种系列......
  • LeetCode面试150——121买卖股票的最佳时机
    题目难度:简单默认优化目标:最小化平均时间复杂度。Python默认为Python3。目录1题目描述2题目解析3算法原理及程序实现3.1暴力求解3.2动态规划参考文献1题目描述给定一个数组prices,它的第i个元素prices[i]表示一支给定股票第i天的价格。你只能选择......
  • CS50x2023 Psets9“财务”。获取股票报价时的“查找”功能问题
    我在此任务中的问题是从查找函数获取任何其他“无”输出。经过几天的战斗,我实现了yt教程中的代码,精确地为1到1,但它仍然给出相同的结果-查找“无”。我不知道我可以在哪里寻找这种行为的根源。下面我附上了我的“quote.html”和@quote应用程序Python代码,用于在本练习中获取......
  • akshare库实现股票自动分析(一)
    **一、背景和目的**背景:自己实现的网络爬虫接口,经常会因为限流或者被爬网站的保护而实现,需要自己不断的维护,才能获取股票的原始数据目的:通过完善的第三方库获取股票信息,因此股票分析的系统后续工作重点就可以放在股票的筛选上,而不用本末倒置 **二、主要思路**    **三......