代码随想录刷题第50天|LeetCode123买卖股票的最佳时机III,LeetCode188买卖股票的最佳时机IV

news/2024/10/25 11:34:57/

1、LeetCode123买卖股票的最佳时机III

题目链接:123、买卖股票的最佳时机III

本题要求至多买卖两次,这意味着可以买卖一次,可以买卖两次,也可以不买卖。

一天一共有5个状态

0:没有操作 

1:第一次持有股票

2:第一次不持有股票

3:第二次持有股票

4:第二次不持有股票

1、dp[i][j]中 i表示第i天,j为 [0 - 4] 五个状态,dp[i][j]表示第i天状态j所剩最大现金。

2、递推公式:

达到dp[i][1]状态,有两个具体操作:

        操作一:第i天买入股票了,那么dp[i][1] = dp[i-1][0] - prices[i]

        操作二:第i天没有操作,而是沿用前一天买入的状态,即:dp[i][1] = dp[i - 1][1]

同理dp[i][2]也有两个操作:

        操作一:第i天卖出股票了,那么dp[i][2] = dp[i - 1][1] + prices[i]

        操作二:第i天没有操作,沿用前一天卖出股票的状态,即:dp[i][2] = dp[i - 1][2]

同理可推出剩下状态部分:

        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、初始化:

第0天没有操作,这个最容易想到,就是0,即:dp[0][0] = 0;

第0天做第一次买入的操作,dp[0][1] = -prices[0];

第0天做第一次卖出的操作,可以理解当天买入,当天卖出,所以dp[0][2] = 0;

第0天第二次买入操作,相当于第0天第一次买入了,第一次卖出了,然后再买入一次,dp[0][3] = -prices[0];

同理第二次卖出初始化dp[0][4] = 0;

4、遍历顺序:从前向后。

5、举例推导。

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

2、LeetCode188买卖股票的最佳时机IV

题目链接:188、买卖股票的最佳时机IV

1、使用二维数组 dp[i][j] :第i天的状态为j,所剩下的最大现金是dp[i][j]

每天状态为:

0:没有操作 

1:第一次持有股票

2:第一次不持有股票

3:第二次持有股票

4:第二次不持有股票

......

本题至多可以买卖k次,每买卖一次,都对应了两天的状态,即第一天买入第二天卖出。

奇数买入偶数卖出。

所以 j 的范围一共可以有 2 * k + 1, 下标从0开始 最大达到2 * k。

2、递推公式:

上一题的递推公式为:

            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]);

本题奇数买入,偶数卖出。

            for (int j = 0; j < 2 * k; j += 2)
            {
                dp[i][j + 1] = max(dp[i - 1][j + 1], dp[i - 1][j] - prices[i]);
                dp[i][j + 2] = max(dp[i - 1][j + 2], dp[i - 1][j + 1] + prices[i]);
            }

3、初始化:

dp[0][j]当j为奇数的时候都初始化为 -prices[0];

4、遍历顺序:从前向后。

5、举例推导。

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


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

相关文章

OpenCV项目开发实战--如何读取图像(Python、C++)代码实现

在 OpenCV 中,您可以使用imread轻松读取不同文件格式(JPG、PNG、TIFF 等)的图像。基本用法如下 C++ Mat imread(const string& filename, int flags=IMREAD_COLOR ) Python image = cv2.imread(filename, flags=cv2.IMREAD_COLOR) flags选项用于控制图像的读取方式…

设计模式-03.02-创建型-工厂建造者原型

工厂模式【常用】 工厂模式很重要&#xff0c;后面的很多架构设计&#xff0c;都是工厂模式联合着其它设计模式使用。 一般情况下&#xff0c;工厂模式分为三种更加细分的类型&#xff1a;简单工厂、工厂方法和抽象工厂。不过&#xff0c;在 GoF 的《设计模式》一书中&#xff…

JS 之 事件Event对象详解(属性、方法、自定义事件)

一、Event对象 1、简介 ​ 事件event对象是指在浏览器中触发事件时&#xff0c;浏览器会自动创建一个event对象&#xff0c;其中存储了本次事件相关的信息&#xff0c;包括事件类型、事件目标、触发元素等等。浏览器创建完event对象之后&#xff0c;会自动将该对象作为参数传…

MySQL查询语句中七个查询命令特征

MySQL查询语句中七个查询命令特征 一. FROM 作用&#xff1a; 将硬盘上的表文件加载到内存中&#xff0c;生成一个全新的临时表。定位内存中已经存在的临时表。 注意&#xff1a; 在一个查询语句中&#xff0c;第一个执行的命令永远是FROM。FROM定位的是内存中的一个临时表&a…

用Django框架完成一个相对完善的一个手机商城(三)

用Django框架完成一个相对完善的一个手机商城 前边我们展示了views中的代码&#xff0c;来我们来展示后台的界面&#xff0c;代码我就不全部展示了 这里给大家介绍一下一个列表分页的写法 from django import template register template.Library()from django.utils.html…

华为OD机试真题 JavaScript 实现【IPv4地址转换成整数】【2023 B卷 100分】

一、题目描述 存在一种虚拟 IPv4 地址&#xff0c;由4小节组成&#xff0c;每节的范围为0~255&#xff0c;以#号间隔&#xff0c; 虚拟 IPv4 地址可以转换为一个32位的整数&#xff0c;例如&#xff1a; 128#0#255#255&#xff0c;转换为32位整数的结果为2147549183&#xff0…

第五章 结构化设计

结构化设计的概念 1. 设计的定义 一种软件开发活动&#xff0c;定义实现需求规约所需的软件结构。 结构化设计分为&#xff1a; (1)总体设计&#xff1a;确定系统的整体模块结构&#xff0c;即系统实现所需要的软件模块以及这些模块之间的调用关系。 (2)详细设计&#xff1a;…

LCHub 6 月低代码平台排行榜发布

LCHub低代码平台排行榜 2023 国产低代码名录和产品信息一览 2023国产低代码平台排行榜 低代码最新视频课程 最新解读报告:2023年6月低代码平台排行榜:维格表 伙伴云上升最快 共有120个低代码平台参与排名, 点击查看排名规则更新 TOP 10 低代码平台 6月 LCHub 指数走势