news 2026/6/10 1:10:17

代码随想录算法训练营第三十四天 | 198.打家劫舍、213.打家劫舍II、337.打家劫舍III

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
代码随想录算法训练营第三十四天 | 198.打家劫舍、213.打家劫舍II、337.打家劫舍III

代码随想录算法训练营第三十四天任务

  • 198.打家劫舍
  • 213.打家劫舍II
  • 337.打家劫舍III

198.打家劫舍

题目链接:198.打家劫舍
递归五步曲分析:

  1. 确定dp数组下标及其含义
    dp[i]: 表示在[0~i]之间的房间进行偷窃的最高金额为dp[i]
  2. 确定递推公式
    偷盗当前房屋 i : dp[i - 2] + nums[i]
    不偷当前房屋 i : dp[i - 1]
    取最高金额,所以递推公式为:dp[i] = max(dp[i - 1], dp[i - 2] + nums[i])
  3. 初始化
    dp[0] = nums[0];
    dp[1] = max(nums[0], nums[1])
  4. 确定遍历顺序
    从前面房前是否被偷来确定时候偷后面的房间,所以遍历顺序是从前往后的。
  5. 举例推倒
classSolution{public:introb(vector<int>&nums){if(nums.size()==1)returnnums[0];vector<int>dp(nums.size(),0);dp[0]=nums[0];dp[1]=max(nums[0],nums[1]);for(inti=2;i<nums.size();++i){dp[i]=max(dp[i-1],dp[i-2]+nums[i]);}returndp[nums.size()-1];}};

时间复杂度:O(n)
空间复杂度:O(n)

213.打家劫舍II

题目链接:213.打家劫舍II
首尾任选其一。
房间首尾相连:只包含首元素不包含尾元素和只包含尾元素不包含首元素两种情况取最大值。
这道题看题解了,我对问题的拆分能力还待提升。

classSolution{private:introbRange(vector<int>&nums,intstart,intend){// 左闭右闭区间if(start==end)returnnums[start];vector<int>dp(nums.size(),0);dp[start]=nums[start];dp[start+1]=max(nums[start],nums[start+1]);for(inti=start+2;i<=end;++i){dp[i]=max(dp[i-1],dp[i-2]+nums[i]);}returndp[end];}public:introb(vector<int>&nums){if(nums.size()==1)returnnums[0];intresult1=robRange(nums,0,nums.size()-2);// 包含首元素,不包含尾元素intresult2=robRange(nums,1,nums.size()-1);// 不包含首元素,包含尾元素returnmax(result1,result2);}};

时间复杂度:O(n)
空间复杂度:O(n)

337.打家劫舍III

题目链接:337.打家劫舍III
dp数组在树形结构上进项状态转移,秒啊!
递归三步曲+动规五步曲

  1. 确定递归函数的参数和返回值 (及dp数组含义)
    每个节点有 偷与不偷 两种状态所获得的金钱。
    用一个长度为2的dp数组表示。
    dp[0]表示不偷该节点获得的最大金额。
    dp[1]表示 偷 该节点获得的最大金额。
    所以递归参数,是节点
    递归返回值是一个长度为2的数组。

    vector<int>robTree(TreeNode*cur)
  2. 确定终止条件 (dp初始化)
    如果是空节点,偷 与 不偷 , 金额都为0.

    if(cur==nullptr)returnvector<int>{0,0};
  3. 确定遍历顺序
    需要通过递归返回值来进行下一步的计算,所以采用后序遍历。
    递归左节点,递归右节点

  4. 确定当前节点的递归逻辑 (dp递推公式)
    如果偷当前节点,其左右孩子就不能偷, 最大金额为:val1 = cur->val + left[0] + right[0]
    left[0]表示不偷左孩子的最大金额;
    right[0]表示不偷右孩子的最大金额;
    如果不偷当前节点,左右孩子就可以偷,最大金额为左右孩子偷 或 不偷的最大金额:
    val2 = max(left[0], left[1]) + max(right[0], right[1])
    当前节点的状态为:{val2, val1}

  5. 举例推导

classSolution{private:// dp[0]:不偷; dp[1]:偷vector<int>traversal(TreeNode*cur){if(cur==nullptr)return{0,0};vector<int>left=traversal(cur->left);vector<int>right=traversal(cur->right);intval1=cur->val+left[0]+right[0];// 偷当前节点intval2=max(left[0],left[1])+max(right[0],right[1]);// 不偷当前节点return{val2,val1};}public:introb(TreeNode*root){vector<int>result=traversal(root);returnmax(result[0],result[1]);}};

时间复杂度:O(n)
空间复杂度:O(log n)

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/9 23:42:20

Octo论文详解

论文&#xff1a;Octo&#xff1a;An Open-Source Generalist Robot Policy 1. 引言 机器人领域构建“通用策略模型”面临多重挑战&#xff0c;包括处理不同的机器人结构、传感器设置、动作空间、任务规格和环境条件等&#xff0c;考虑设计和开发一个具备广泛适应性的机器人策略…

作者头像 李华
网站建设 2026/6/9 22:11:29

基于python+django的学生就业管理的招聘系统(源码+lw+部署文档+讲解等)

课题介绍本课题聚焦校园就业招聘中信息不对称、流程管理低效的痛点&#xff0c;设计并开发基于PythonDjango的学生就业管理与招聘系统。系统以Python作为核心开发语言&#xff0c;依托Django框架搭建高效稳定的后端服务架构&#xff0c;负责处理多角色权限管控、招聘信息发布、…

作者头像 李华
网站建设 2026/6/9 18:05:55

JVM 之 内存溢出实战【OOM? SOF? 哪些区域会溢出?堆、虚拟机栈、元空间、直接内存溢出时各自的特点?以及什么情况会导致他们溢出?并模拟溢出】

实战&#xff1a;OutOfMemoryError异常 除了程序计数器外&#xff0c;堆、虚拟机栈、元空间、直接内存都有发生OOM的可能 下面我们演示下引起各区域OOM的情况&#xff0c;及观察下其异常表现&#xff0c;进而初步总结各异常时的调优策略 JVM调优实例&#xff1a; 堆&#xff1a…

作者头像 李华
网站建设 2026/6/5 14:21:18

磁链观测器实战:从仿真到代码的闭环之旅

磁链观测器(仿真&#xff0b;闭环代码参考文档&#xff09; 1.仿真采用simulink搭建&#xff0c;2018b版本 2.代码采用Keil软件编译&#xff0c;思路参考vesc中使用的方法&#xff0c;自己编写的代码能够实现0速闭环启动&#xff0c;并且标注有大量注释&#xff0c;方便学习。 …

作者头像 李华
网站建设 2026/6/7 18:01:35

基于TMS320F28335芯片的BUCK双闭环PI DSP代码

基于TMS320F28335芯片的BUCK双闭环&#xff08;PI&#xff09;DSP代码搞电力电子的老司机们对BUCK电路都不陌生&#xff0c;但要把双闭环PI控制塞进DSP里跑起来&#xff0c;这事儿还真得跟TMS320F28335的寄存器大战三百回合。今天咱们就扒开这个芯片的"内脏"&#xf…

作者头像 李华
网站建设 2026/6/5 14:30:49

vue基于spring的线上文印店打印店平台设计与实现_61624t38

目录具体实现截图项目介绍论文大纲核心代码部分展示项目运行指导结论源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作具体实现截图 本系统&#xff08;程序源码数据库调试部署讲解&#xff09;同时还支持java、ThinkPHP、Node.js、Spring B…

作者头像 李华