代码随想录算法训练营刷题复习2 :动态规划——打家劫舍系列+买卖股票系列

复习刷题第二天:动态规划——打家劫舍系列+买卖股票系列

一、打家劫舍系列:

主要设置限定条件不能选择连续的两个值,这里判断偷不偷第(i)家,取决于 偷(i-1) 与 偷(i-2) + (i)哪种情况划得来

198.打家劫舍
213.打家劫舍Ⅱ
这个题的思路主要是把“圆圈”邻居首尾可能连着偷的情况,分开讨论了,①不带头②不带尾
337.打家劫舍Ⅲ
这里的邻居相邻关系结合二叉树情况稍微复杂一点,这一轮还是没写出来,主要是二叉树的后序遍历递归实现不熟练没写出来。
每个节点考虑偷和不偷两种状态,从孩子节点(底)遍历到头结点(头),最后选择偷不偷头节点的利益最大值

198.打家劫舍

class Solution {
public:int rob(vector<int>& nums) {if(nums.size()<=0)return 0;if(nums.size()==1)return nums[0];vector<int> dp(nums.size(),0);//初始化需要定义dp[0]和dp[1]dp[0]=nums[0];dp[1]=max(nums[0],nums[1]);//偷i需要判断 dp[i-1]大还是(dp[i-1]+nums[i])大for(int i=2;i<nums.size();i++) {dp[i] = max(dp[i-1], dp[i-2]+nums[i]);}return dp[nums.size()-1];}
};

213.打家劫舍Ⅱ

class Solution {
public:int rob_2(vector<int>& nums,int start,int end) {//以下三步可以简化为:// if(start==end)//       return nums[start];if(end-start+1==0)return 0;if(end-start+1==1)return nums[start];if(end-start+1==2)return max(nums[start],nums[end]);vector<int> dp(nums.size(),0);dp[start] = nums[start];dp[start+1] = max(nums[start],nums[start+1]);for(int i = start+2;i<=end;i++)dp[i] = max(dp[i-1],dp[i-2]+nums[i]);return dp[end];}
//大体的思路是对的,上面那个函数写的有点复杂int rob(vector<int>& nums) {if(nums.size()==0)return 0;else if(nums.size()==1)return nums[0];//这一步其实可以不要else if(nums.size()==2)return max(nums[0],nums[1]);//第一种情况是不要第一个元素(防止与末尾紧挨被报警)int q1 = rob_2(nums,1,nums.size()-1);//第二种情况是不要最后一个元素(防止与第一个元素紧挨被报警)int q2 = rob_2(nums,0,nums.size()-2);return max(q1,q2);}
};

337.打家劫舍Ⅲ

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:int rob(TreeNode* root) {vector<int> result(robTree(root));return max(result[0],result[1]);}vector<int> robTree(TreeNode* cur) {//返回也要是一个数组if(cur==NULL)return vector<int>{0,0};vector<int> left = robTree(cur->left);vector<int> right = robTree(cur->right);// 每个节点使用两种状态记录:不被偷r0,被偷r1int r0 = max(left[0],left[1]) + max(right[0],right[1]);int r1 = cur->val + left[0] + right[0];return {r0,r1};}
};

二、买卖股票的最佳时机

这个系列写起来挺顺利的,问题不大。
121.买卖股票的最佳时机
122.买卖股票的最佳时机Ⅱ
123.买卖股票的最佳时机Ⅲ
188.买卖股票的最佳时机Ⅳ
309.买卖股票的最佳时机含冷冻期
714.买卖股票的最佳时机含手续费

121.买卖股票的最佳时机

class Solution {
public:int maxProfit(vector<int>& prices) {//对于每一支股票,都有买/保持   卖/保持 这两种状态,定义 prices.size()*2的数据矩阵vector<vector<int>> dp(prices.size(),vector<int>(2,0));//数据的初始化,根据dp数组的含义:dp[i][0]表示买入当前股票或者保持前面已购买的股票  的利润//                            dp[i][1]表示卖出当前股票或者保持已经卖出的状态     的利润dp[0][0]=-prices[0];dp[0][1]=0;for(int i=1;i<prices.size();i++) {dp[i][0] = max(dp[i-1][0],-prices[i]);   //买的时候尽可能低价买入,买没买贵,取max就知道dp[i][1] = max(dp[i-1][1],dp[i-1][0]+prices[i]);  //卖的时候看此时卖出的钱多还是以前卖出的多,也是取max}return dp[prices.size()-1][1]; }
};

122.买卖股票的最佳时机Ⅱ

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

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

class Solution {
public:int maxProfit(vector<int>& prices) {//dp的定义,进行两次交易,可以分为四次操作,dp[i][0]默认初始化为0//dp[i][1] dp[i][3]表示第一次第二次买入/保持买入状态//dp[i][2] dp[i][4]表示第一次第二次卖出/保持卖出状态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 max(dp[prices.size()-1][2],dp[prices.size()-1][4]);}
};

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

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

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

class Solution {
public:int maxProfit(vector<int>& prices) {//1.(从冷冻期结束、)买入/保持买入//2.之前卖出 此时无动作 or 处于冷冻期//3.可卖出期,//4.冷冻期,保持上一个状态if(prices.size()<=1)return 0;vector<vector<int>> dp(prices.size(),vector<int>(4,0));dp[0][0]=-prices[0];for(int i=1;i<prices.size();i++) {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];}return max(dp[prices.size()-1][1],max(dp[prices.size()-1][2],dp[prices.size()-1][3]));}
};

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/28001.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

靠谱放心!康姿百德柔压磁性豪华枕质量大揭秘

康姿百德柔压磁性豪华枕&#xff0c;舒爽透气呵护青春期娇嫩肌肤 良好的睡眠对青少年的生长发育至关重要&#xff0c;想要获得高质量睡眠&#xff0c;除了选择合适的床垫之外&#xff0c;一款合适的枕头同样是打造优质睡眠环境的重要一环。康姿百德集团有限公司深耕睡眠领域已…

记录认识相亲对象的帖子——之一——困惑金钱

我的提问&#xff1a; 我经常觉得我连自己都养不活&#xff0c;还负责了10多w, 作为中国的父母&#xff0c;他们强烈认为亲戚给我介绍一个对象&#xff0c;我就要主动积极的去联系女方&#xff0c;我对自己有比较清楚的认识。认为自身条件太差&#xff0c;然后我不愿意花钱给女…

electron模板【lectron-react-boilerplate】多窗口配置【HtmlWebpackPlugin】多页面配置

如果您正在使用electron-react-boilerplate进行快速的Electron应用程序开发,您可能会遇到想要在桌面应用程序中拥有多个原生窗口的情况。 MacOS窗口图像由OpenClipart-Vectors提供,来源Pixabay。 开始之前需要提及的事情! Electron有一个主进程和渲染进程的模式。可以有多个…

47-4 内网渗透 - MSF介绍

一、MSF简介 Metasploit框架(Metasploit Framework, MSF)是一款开源工具,专为渗透测试设计。它由Ruby编程语言编写,具有高度的扩展性,可以方便渗透测试人员开发和使用定制化的工具模板。 Metasploit提供多种接口来控制测试过程,包括控制台、Web界面和命令行界面(CLI)。…

【博客718】时序数据库基石:LSM Tree(log-structured merge-tree)

时序数据库基石&#xff1a;LSM Tree(log-structured merge-tree) 1、为什么需要LSM Tree LSM被设计来提供比传统的B树更好的写操作吞吐量&#xff0c;通过消去随机的本地更新操作来达到这个目标&#xff0c;使得写入都是顺序写&#xff0c;而不是随机写。 那么为什么这是一个…

Redis在互联网大厂中的应用案例分析

携程金融的Redis架构 携程金融在经过多年的演进后,形成了多层次的系统架构,其中基础数据(如用户信息、产品信息、订单信息等)由底层系统产生,并服务于所有的金融系统。这些基础数据通过统一的缓存服务(系统名utag)进行缓存。缓存数据具有全量、准实时、永久有效的特点,…

大模型开发LangChain简介

LangChain 是一个用于构建大型语言模型 (LLM) 驱动应用程序的开发框架。它提供了强大的工具和功能&#xff0c;帮助开发者更高效地使用语言模型来构建复杂的应用程序。 LangChain 的主要功能和特点 1、模块化设计&#xff1a; LangChain 采用模块化设计&#xff0c;分为多个…

macbook pro 鼠标键 导致鼠标失灵

问题 关闭鼠标键之后 所有键盘还是不可用&#xff08;开关机键除外&#xff09; 解决 开机按住commands进入单用户模式exit重启电脑

Qt事件处理和传递流程

事件系统的概述 事件的类型 Qt 支持多种事件类型&#xff0c;每种类型代表不同的用户交互或系统事件。常见的事件类型包括&#xff1a; 输入事件&#xff1a;如鼠标事件&#xff08;QMouseEvent&#xff09;、键盘事件&#xff08;QKeyEvent&#xff09;。窗口事件&#xff…

【漏洞复现】东胜物流软件 GetProParentModuTreeList SQL注入漏洞

0x01 产品简介 东胜物流软件是青岛东胜伟业软件有限公司-款集订单管理、仓库管理、运输管理等多种功能于一体的物流管理软件。该公司初创于2004年11月(前身为青岛景宏物流信息技术有限公司)&#xff0c;专注于航运物流相关环节的产品和服务。东胜物流信息管理系统货代版采用MS…

个人网站制作 Part 26 添加在线日历功能 | Web开发项目添加页面缓存

文章目录 &#x1f469;‍&#x1f4bb; 基础Web开发练手项目系列&#xff1a;个人网站制作&#x1f680; 添加在线日历功能&#x1f528;使用日历服务&#x1f527;步骤 1: 选择日历服务&#x1f527;步骤 2: 安装FullCalendar&#x1f527;步骤 3: 创建FullCalendar组件&…

MIME 类型:Web 内容的多样性与标准化

MIME 类型&#xff1a;Web 内容的多样性与标准化 MIME 类型&#xff0c;全称为“多用途互联网邮件扩展类型”&#xff08;Multipurpose Internet Mail Extensions&#xff09;&#xff0c;是互联网上用于标识文档性质和格式的一种标准。它最初被设计用于电子邮件系统&#xff…

洛阳的建筑工程设计资质延续操作要点

资质延续操作要点&#xff1a; 提前准备&#xff1a;在资质证书有效期届满前&#xff0c;企业应提前做好准备工作&#xff0c;确保所有需要的资料齐全、有效&#xff0c;如企业营业执照、资质证书原件、财务审计报告、企业诚信记录、技术人员证书及社保缴纳证明等。 在线申报…

【健身经验】3 拜拜肉

1 女性手臂粗细与紧实程度&#xff0c;除了取决于运动和生活习惯&#xff0c;很大程度上取决于遗传因素 2 2 如果体脂已经很正常了&#xff0c;整体看起来匀称不胖&#xff0c;偏偏这两块肌肉附近的脂肪“顽固不化”的话&#xff0c;可以试试以下两个简单方法 对于体脂率正常…

XUbuntu22.04之ssh+x11显示远程图形到本机(二百四十四)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

手把手带你开发一套用户权限系统,精确到按钮级

在实际的软件项目开发过程中&#xff0c;用户权限控制可以说是所有运营系统中必不可少的一个重点功能&#xff0c;根据业务的复杂度&#xff0c;设计的时候可深可浅&#xff0c;但无论怎么变化&#xff0c;设计的思路基本都是围绕着用户、角色、菜单这三个部分展开。 如何设计…

光电展厅如何运用数字多媒体实现互动传播?

近年来&#xff0c;展厅设计行业在多媒体技术的推动下&#xff0c;迎来了前所未有的变革与繁荣。在这一浪潮中&#xff0c;光电展厅凭借其智能化科技的应用和紧跟时代潮流的设计&#xff0c;成为了电力知识普及的璀璨舞台。它不仅在展示形式上实现了多元化和创新&#xff0c;更…

【linux】认识“文件”的本质,理解“文件系统”的设计逻辑,体会linux优雅的设计理念

⭐⭐⭐个人主页⭐⭐⭐ ~~~~~~~~~~~~~~~~~~ C站最❤❤❤萌❤❤❤博主 ~~~~~~~~~~~~~~~~~~~ ​♥东洛的克莱斯韦克-CSDN博客♥ ~~~~~~~~~~~~~~~~~~~~ 嗷呜~ ✌✌✌✌ 萌妹统治世界~ &#x1f389;&#x1f389;&#x1f389;&#x1f389; ✈✈✈✈相关文章✈✈✈✈ &#x1f4a…

REST风格

黑马程序员Spring Boot2 文章目录 1、REST简介1.1 优点1.2 REST风格简介1.3 注意事项 2、RESTful入门案例 1、REST简介 1.1 优点 隐藏资源的访问行为&#xff0c;无法通过地址的值对资源适合中操作书写简化 1.2 REST风格简介 按照RST风格访问资源时使用行为动作区分对资源进…

微信小程序的常用事件的用法

在微信小程序中&#xff0c;事件绑定是非常常见的操作。以下是一些常用事件的具体用法和示例&#xff1a; 1. bindtap 或 catchtap 点击事件&#xff0c;当用户点击某个元素时触发。 html <!-- WXML 文件 --> <view bindtap"handleTap">点击我</vi…