代码随想录第51天 | 309.最佳买卖股票时机含冷冻期 、 714.买卖股票的最佳时机含手续费

ops/2024/9/25 23:13:40/

一、前言

参考文献:代码随想录;

今天还是买卖股票,只是又多了一些条件。一个是含有冷冻期,在冷冻期期间不可出售股票;

我们直接开始做题吧!

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

1、思路:

其实这个买卖股票善于总结的话(可惜我不太擅长)就会发现这个是有一个模板的,dp数组为二维数组,行表示第几天,列表示各个状态;

(1)确定dp数组:

        vector<vector<int>> dp(prices.size(), vector<int> (4, 0));

通过对卡哥的视频观看发现,一共有四种状态:持有股票、不持有股票(不在当天卖出)、卖出股票、冷冻期;这就可以通过每个状态的要求,来推出每个状态的递推公式;

(2)递推公式:

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

递推公式就是由这四种状态的约束条件所确定的;

(3)遍历顺序:

可以省略,从前向后;

(4)初始化:

其实通过带入递推公式发现,初始化除了持有股票为-prices[0]之外,其他都为0;

2、整体代码如下:

class Solution {
public:int maxProfit(vector<int>& prices) {// 1、确定递推公式vector<vector<int>> dp(prices.size(), vector<int> (4, 0));// 2、初始化// 状态1:买入股票的状态dp[0][0] = -prices[0];// 状态2:保持卖出的状态(不包括当天卖出)dp[0][1] = 0;// 状态3:卖出股票dp[0][2] = 0;// 状态4:冷冻期dp[0][3] = 0;// 3、遍历顺序// 通过递推公式可以发现,这个是从前向后遍历for (int i = 1; i < prices.size(); i++) {// 4、递推公式,地推四种状态dp[i][0] = max(dp[i - 1][0], max(dp[i - 1][1] - prices[i], dp[i - 1][3] - prices[i]));dp[i][1] = max(dp[i - 1][1], dp[i - 1][3]);dp[i][2] = dp[i - 1][0] + prices[i];dp[i][3] = dp[i - 1][2];}// 5、打印dp数组// for (auto i : dp) {//     for (auto j : i) {//         cout << j << " ";//     }//     cout << endl;// }return max(dp[prices.size() - 1][1], max(dp[prices.size() - 1][2], dp[prices.size() - 1][3]));}
};

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

1、思路:

本题就是当出现一个完整的买卖交易时,就需要支付一定的手续费;

那么这一题和买卖股票II相似,只是加了一个手续费而已;

2、整体代码如下:

 

class Solution {
public:int maxProfit(vector<int>& prices, int fee) {// 1、创建dp数组vector<vector<int>> dp(prices.size(), vector<int>(2, 0));// 2、初始化// 买入// 一次完整的交易才需要付一个手续费dp[0][0] = -prices[0];// 3、遍历顺序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] - fee);}return dp[prices.size() - 1][1];}
};

Time to study:1h

leave message:

 The young do not know enough to be prudent, and therefore they attempt the impossible, and achieve it, generation afeter generation.

正因为年轻人所知不多而不够谨慎,才是他们总在尝试不可能的事情,并实现了它,代代如此;

 

 


http://www.ppmy.cn/ops/15455.html

相关文章

opencv 打开中文路径图报错

img cv.imread(中文图, 1) [ WARN:06.414] global D:\a\opencv-python\opencv-python\opencv\modules\imgcodecs\src\loadsave.cpp (239) cv::findDecoder imread_(‘D:/download/中文.png’): can’t open/read file: check file path/integrity 转换编码无法解决 file_pa…

Eclipse debug时有几个常用的快捷键非常实用

Eclipse debug时&#xff0c;有几个常用的快捷键非常实用。 F5&#xff1a;Step Into&#xff0c;单步执行&#xff0c;遇到子函数就进入并且继续单步执行。简而言之&#xff0c;这个快捷键会让你进入子函数&#xff0c;详细查看所执行的每一步。 F6&#xff1a;Step Over&…

FFmpeg 音视频处理

我们知道&#xff0c;使用FFmpeg 很容易对音视频进行处理&#xff0c;这里分享总结下之前一个项目用到的音视频分割&#xff0c;合成脚本。 涉及的主要操作&#xff1a;音频静音剔除&#xff0c;视频提取音频&#xff0c;音频拼接技术&#xff0c;混合音视频流操作 &#xff08…

关于pdf.js获取不到文本的问题

在使用pdf.js获取PDF文本时&#xff0c;发现有部分文件获取不到文本&#xff08;另&#xff1a;vue-pdf依赖于pdf.js&#xff0c;所以也会出现这个问题&#xff09;。 此时&#xff0c;控制台其实给出了警告提示信息&#xff0c;只不过是用console.log打印的&#xff0c;容易被…

LeetCode-数组中最长的方波

每日一题 今天刷的这道题使用的是动态规划的方法。 题目要求 给你一个整数数组 nums 。如果 nums 的子序列满足下述条件&#xff0c;则认为该子序列是一个 方波 &#xff1a; 子序列的长度至少为 2 &#xff0c;并且将子序列从小到大排序 之后 &#xff0c;除第一个元素外&…

C语言进阶课程学习记录- 递归函数分析

C语言进阶课程学习记录 - 递归函数分析 实验-递归计算字符串长度实验-斐波拉且数列实验小结 本文学习自狄泰软件学院 唐佐林老师的 C语言进阶课程&#xff0c;图片全部来源于课程PPT&#xff0c;仅用于个人学习记录 实验-递归计算字符串长度 #include <stdio.h>int strl…

python-自动化篇-终极工具-用GUI自动控制键盘和鼠标-pyautogui-键盘

文章目录 键盘键盘——记忆宫殿入门——通过键盘发送一个字符串——typewrite()常规——键名——typewrite()常规——按下键盘——keyDown()常规——释放键盘——keyUp()升级——热键组合——hotkey() 键盘 pyautogui也有一些函数向计算机发送虚拟按键&#xff0c;让你能够填充…

deque的插入和删除

函数原型 两端插入操作 push_back(elem) //向容器尾部添加一个数据push_front(elem) //向容器头部插入一个数据pop_back() //删除容器最后一个数据 pop_front() //删除第一个容器第一个数据 …