代码随想录算法训练营第四十八天【动态规划part09】 | 198.打家劫舍、213.打家劫舍II、337.打家劫舍III

本文主要是介绍代码随想录算法训练营第四十八天【动态规划part09】 | 198.打家劫舍、213.打家劫舍II、337.打家劫舍III,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

198.打家劫舍

题目链接:

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

求解思路:

当前房屋偷与不偷取决于前一个房屋是否被偷了

动规五部曲

  1. 确定dp数组及其下标含义:考虑下标i(包括i)以内的房屋,最多可以偷的金额为dp[i]
  2. 确定递归公式:如果前一个屋子被抢了,那么现在这间屋子不能抢,即dp[i] = dp[i-1];如果前一间屋子没被抢,那么这件屋子可以抢,即dp[i] = dp[i - 2] + nums[i];取较大值,dp[i] = max(dp[i - 2] + nums[i], dp[i - 1]);
  3. dp数组的初始化:递推公式的基础为dp[0]和dp[1],从定义中可以得到dp[0] = nums[0],dp[1] = max(nums[0], nums[1]);
  4. 确定遍历顺序:dp[i] 是根据dp[i - 2] 和 dp[i - 1] 推导出来的,从前到后遍历
  5. 举例推导dp数组:以[2,7,9,3,1]为例,如图

代码:

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] = nums[0];dp[1] = max(nums[0], nums[1]);for (int i = 2; i < nums.size(); i++){dp[i] = max(dp[i-2]+nums[i], dp[i-1]);}return dp[nums.size()-1];}
};

213.打家劫舍II

题目链接:

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

求解思路:

分成两种情况,一种是不包含头元素,一种是不包含尾元素,取较大值即可。

求解思路与上一题一样。

代码:

class Solution {
public:int rob(vector<int>& nums) {if (nums.size() == 0) return 0;if (nums.size() == 1) return nums[0];int r1 = robRange(nums, 0, nums.size()-2);int r2 = robRange(nums, 1, nums.size()-1);return max(r1, r2);}int robRange(vector<int>& nums, int start, int end){if (start == end) return nums[start];vector<int> dp(nums.size());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-2]+nums[i], dp[i-1]);}return dp[end];}
};

337.打家劫舍III

题目链接:

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

求解思路:

使用一个长度为2的数组,记录当前节点偷和不偷所得到的最大金钱

递归+动规

  1. 确定递归函数的参数和返回值:参数为当前节点,返回值为一个长度为2的数组;其中数组下标为0记录不偷该节点所得到的最大金钱,下标为1记录偷该节点所得到的最大金钱
  2. 确定终止条件:遇到空间点,无论偷还是不偷都是0,返回
  3. 确定遍历顺序:后序遍历二叉树,因为要通过递归函数的返回值来做下一步计算
  4. 确定单层递归逻辑:如果偷当前节点,则左右孩子都不能投,此时val1 = cur->val + left[0] + right[0];如果不偷当前节点,则左右孩子可偷可不偷,取较大的值,此时val2 = max(left[0], left[1]) + max(right[0], right[1]);注意最后返回{val2, val1},即{不偷当前节点得到的最大金钱,偷当前节点得到的最大金钱}
  5. 举例推导dp数组:以示例1为例,如图

代码:

/*** 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]);}// 长度为2的数组,0表示不偷,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);// 偷cur,则不能偷其左右孩子int val1 = cur->val + left[0]+ right[0];// 不偷cur,则左右孩子可偷可不偷,取较大值int val2 = max(left[0], left[1]) + max(right[0], right[1]);// 注意这里的返回顺序不可以错return {val2, val1};}
};

这篇关于代码随想录算法训练营第四十八天【动态规划part09】 | 198.打家劫舍、213.打家劫舍II、337.打家劫舍III的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/438483

相关文章

Java调用DeepSeek API的最佳实践及详细代码示例

《Java调用DeepSeekAPI的最佳实践及详细代码示例》:本文主要介绍如何使用Java调用DeepSeekAPI,包括获取API密钥、添加HTTP客户端依赖、创建HTTP请求、处理响应、... 目录1. 获取API密钥2. 添加HTTP客户端依赖3. 创建HTTP请求4. 处理响应5. 错误处理6.

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后

使用 sql-research-assistant进行 SQL 数据库研究的实战指南(代码实现演示)

《使用sql-research-assistant进行SQL数据库研究的实战指南(代码实现演示)》本文介绍了sql-research-assistant工具,该工具基于LangChain框架,集... 目录技术背景介绍核心原理解析代码实现演示安装和配置项目集成LangSmith 配置(可选)启动服务应用场景

Python中顺序结构和循环结构示例代码

《Python中顺序结构和循环结构示例代码》:本文主要介绍Python中的条件语句和循环语句,条件语句用于根据条件执行不同的代码块,循环语句用于重复执行一段代码,文章还详细说明了range函数的使... 目录一、条件语句(1)条件语句的定义(2)条件语句的语法(a)单分支 if(b)双分支 if-else(

MySQL数据库函数之JSON_EXTRACT示例代码

《MySQL数据库函数之JSON_EXTRACT示例代码》:本文主要介绍MySQL数据库函数之JSON_EXTRACT的相关资料,JSON_EXTRACT()函数用于从JSON文档中提取值,支持对... 目录前言基本语法路径表达式示例示例 1: 提取简单值示例 2: 提取嵌套值示例 3: 提取数组中的值注意

CSS3中使用flex和grid实现等高元素布局的示例代码

《CSS3中使用flex和grid实现等高元素布局的示例代码》:本文主要介绍了使用CSS3中的Flexbox和Grid布局实现等高元素布局的方法,通过简单的两列实现、每行放置3列以及全部代码的展示,展示了这两种布局方式的实现细节和效果,详细内容请阅读本文,希望能对你有所帮助... 过往的实现方法是使用浮动加

JAVA调用Deepseek的api完成基本对话简单代码示例

《JAVA调用Deepseek的api完成基本对话简单代码示例》:本文主要介绍JAVA调用Deepseek的api完成基本对话的相关资料,文中详细讲解了如何获取DeepSeekAPI密钥、添加H... 获取API密钥首先,从DeepSeek平台获取API密钥,用于身份验证。添加HTTP客户端依赖使用Jav

Java实现状态模式的示例代码

《Java实现状态模式的示例代码》状态模式是一种行为型设计模式,允许对象根据其内部状态改变行为,本文主要介绍了Java实现状态模式的示例代码,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来... 目录一、简介1、定义2、状态模式的结构二、Java实现案例1、电灯开关状态案例2、番茄工作法状态案例

Java使用POI-TL和JFreeChart动态生成Word报告

《Java使用POI-TL和JFreeChart动态生成Word报告》本文介绍了使用POI-TL和JFreeChart生成包含动态数据和图表的Word报告的方法,并分享了实际开发中的踩坑经验,通过代码... 目录前言一、需求背景二、方案分析三、 POI-TL + JFreeChart 实现3.1 Maven

nginx-rtmp-module模块实现视频点播的示例代码

《nginx-rtmp-module模块实现视频点播的示例代码》本文主要介绍了nginx-rtmp-module模块实现视频点播,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习... 目录预置条件Nginx点播基本配置点播远程文件指定多个播放位置参考预置条件配置点播服务器 192.