当前位置: 首页 > news >正文

代码随想录算法训练营第三十四天 | 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)

http://www.cnnetsun.cn/news/51825.html

相关文章:

  • 【大模型】-LangChain--stream流式同步异步
  • 兜兜英语每日短语:逃单篇
  • 计算机毕业设计springboot汽车智慧检修系统 基于SpringBoot的智能汽车故障预测与维修管理平台 融合IoT的SpringBoot车辆健康监测与维修决策系统
  • python3
  • 【3D图像技术分析与实现】Apple Vision Pro三维成像技术栈深度解析
  • 经典算法题详解之统计重复个数(三)
  • 移动应用开发实验室大一上考核
  • 云数据库服务(如AWS RDS)的优势和考虑因素?
  • 【设计模式|第四篇】适配器模式:让不兼容的接口协同工作
  • asgiref终极指南:高效解决Python异步通信难题
  • 医学影像深度学习知识点总结
  • 从零到一:自动化3D建模的免代码解决方案
  • Kali中生成被控端
  • 13、Linux 文本编辑与命令操作实用指南
  • 20、Linux 备份全攻略
  • 22、Debian系统管理与安全保障全解析
  • 32、Debian变体与基于Debian的其他操作系统
  • 50、无线传感器网络部署方案与加密算法研究
  • 51、无线传感器网络部署方案与LEACH协议优化研究
  • 54、垃圾邮件和即时通讯垃圾信息的分类与控制措施
  • 如何通过AutoGPT生成高质量技术博客为GPU算力引流
  • 多目标蜣螂优化算法NSDBO:微电网多目标优化调度的利器
  • 本研究基于分形纤维丛统一场论,构建了黑洞时空的几何模型,揭示了奇点消解、霍金辐射修正及信息守恒的新机制。该模型的优势在于将宏观时空的广义相对论效应与微观量子的分形特性实现了有机融合。
  • 好写作AI语言侦探:你的论文严谨性“隐形把关人”
  • 解放双手!钉钉智能打卡神器完全上手手册
  • DMXAPI全球模型API调用完全指南:从入门到精通
  • 告别“翻墙“烦恼:DMXAPI让Gemini-3-pro-thinking调用快如闪电
  • leetcode 744. Find Smallest Letter Greater Than Target 寻找比目标字母大的最小字母-耗时100%
  • Home Assistant通知系统:3步打造智能家居提醒中心
  • 学Simulink——机器人轨迹跟踪场景实例:基于Simulink的永磁同步电机笛卡尔空间圆弧轨迹跟踪仿真