Day43: 123.买卖股票的最佳时机III,188.买卖股票的最佳时机IV

news/2024/10/24 11:14:29/

目录

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

思路 

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

思路 


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

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

 

思路 

1. 确定dp数组及其下标含义

     一天一共就有五个状态,

  1. 没有操作 (其实我们也可以不设置这个状态)
  2. 第一次持有股票
  3. 第一次不持有股票
  4. 第二次持有股票
  5. 第二次不持有股票

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

2. 确定递推公式

dp[i][1] = max(dp[i-1][0] - prices[i], dp[i - 1][1]);
dp[i][2] = max(dp[i - 1][1] + prices[i], 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. dp数组初始化

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

4. 确定遍历顺序

       从前向后遍历,因为dp[i],依靠dp[i - 1]的数值 

5. 举例推导dp数组

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][1] = -prices[0];dp[0][3] = -prices[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];}
};
  • 时间复杂度:O(n)
  • 空间复杂度:O(n × 5)

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

188. 买卖股票的最佳时机 IV - 力扣(LeetCode) 

 

思路 

1. 确定dp数组及其下标含义

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

j的状态表示为:

  • 0 表示不操作
  • 1 第一次买入
  • 2 第一次卖出
  • 3 第二次买入
  • 4 第二次卖出
  • .....

二维dp数组定义如下: 

vector<vector<int>> dp(prices.size(), vector<int>(2 * k + 1, 0));

2. 确定递推公式

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

  • 操作一:第i天买入股票了,那么dp[i][1] = dp[i - 1][0] - prices[i]
  • 操作二:第i天没有操作,而是沿用前一天买入的状态,即:dp[i][1] = dp[i - 1][1]

选最大的,所以 dp[i][1] = max(dp[i - 1][0] - prices[i], 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][2] = max(dp[i - 1][1] + prices[i], dp[i - 1][2])

for (int j = 0; j < 2 * k - 1; 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数组初始化

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

4. 确定遍历顺序 

从前向后遍历,因为dp[i],依靠dp[i - 1]的数值。 

5. 举例推导dp数组 

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 j = 1; j < 2 * k; j += 2) {dp[0][j] = -prices[0];}for (int i = 1;i < prices.size(); i++) {for (int j = 0; j < 2 * k - 1; 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];}
};
  • 时间复杂度: O(n * k),其中 n 为 prices 的长度
  • 空间复杂度: O(n * k)

笔记参考:代码随想录


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

相关文章

Adobe Photoshop CC绿色版

下载地址&#xff1a; 链接: https://pan.baidu.com/s/1sge0P5C56JMz-W9pOgvWww 提取码: tgub

PhotoShop CC 64位绿色版

photoshop cc&#xff08;Adobe Creative Cloud Photoshop &#xff09;是 Photoshop CS6 的下一个全新版本&#xff0c;它开启了全新的云时代PS服务。它特别针对摄影师新增了智能锐化、条件动作、扩展智能对象支持、智能放大采样、相机震动减弱等功能&#xff0c;一起体验更加…

Photoshop2022 23.0.0绿色精简版

软件介绍 Adobe Photoshop&#xff08;简称PS&#xff09;是全球最流行的图像处理软件&#xff0c;知名的图像及照片后期处理大型专业软件。Adobe? Photoshop 是 Adobe Creative Cloud 创意云里的图片处理编辑软件热门产品&#xff0c;Photoshop 是数字图象处理的业界标准&am…

nginx配置获取真实ip

要想在应用中获取到真实IP&#xff0c;取决于各个转发节点的传递配置&#xff0c; 第一、要确定客户端使用哪个请求头传递IP地址 第二、第一转发点&#xff0c; proxy_set_header field value value是变量值&#xff0c;来源于请求方 field是变量名&#xff0c;是要发给下一…

java字符串转JSON

java字符串转JSON数组 需要引入hutool的工具类 //jsonString需要用中括号包裹String jsonString byId.getJsonString();// sheet可以直接拿来for循环操作JSONArray sheet JSONUtil.parseArray(jsonString);java字符串转JSON对象 //jsonString需要用大括号包裹//JSONObject.cl…

SingleStore Kai for MongoDB 的 6 个主要功能

SingleStore Kai for MongoDB将实时分析引入JSON文档&#xff0c;通过将MongoDB查询转换为在SingleStoreDB上执行的SQL语句来实现。无需对模式、数据或查询进行任何更改。 在Facebook上分享 在Twitter上分享 在LinkedIn上分享 在Reddit上分享 通过电子邮件分享 打印资源。 如…

多线程并发场景题(持续更新)

1.两线程交替打印a,b&#xff0c;共打印 100 次&#xff1a; 分析&#xff1a; 需要先打印出 a需要保证交替打印需要保证打印 100 次&#xff0c;不多不少 思路&#xff1a;使用一个 flag 变量进行通信&#xff0c; 当 flag 为奇数时打印 a&#xff0c;为偶数时打印 b。线程…

Matlab实现模拟调制与解调

本文会介绍简单的模拟调制解调方法&#xff0c;涉及AM、DSB、SSB&#xff0c;但没有VSB&#xff0c;VSB相关的资料会在后文附上。 幅度调制 幅度调制原理 幅度调制是由调制信号去控制高频载波的幅度&#xff0c;使之随调制信号作线性变化的过程 简单的说&#xff0c;幅度调制…