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

leetcode 刷题day38动态规划Part07 打家劫舍(198.打家劫舍、213.打家劫舍II、337.打家劫舍III)

198.打家劫舍

思路:
1、dp[i]为到第i家偷到的最高金额。
2、如果偷第i家,那么dp[i]=dp[i-2]+nums[i],如果不偷,则dp[i]=dp[i-1],所以递推公式dp[i]=max(dp[i-2]+nums[i],dp[i-1])。
3、初始值,根据递推公式,我们需要知道dp[0]和dp[1]。dp[0]=nums[0], dp[1]=max(nums[0],nums[1]);
4、遍历顺序为从小到大遍历nums[i]。

代码如下:

class Solution {public int rob(int[] nums) {if(nums==null || nums.length==0) return 0;if(nums.length==1) return nums[0];int[] dp=new int[nums.length];dp[0]=nums[0];dp[1]=Math.max(nums[0],nums[1]);for(int i=2;i<nums.length;i++){dp[i]=Math.max(dp[i-1],dp[i-2]+nums[i]);}return dp[nums.length-1];}
}

213.打家劫舍II

思路:该题与上一题的区别在于第一个和最后一个房屋相邻。有两种情况:只考虑打劫第1家到倒数第2家;只考虑打劫第2家到最后一家。

代码如下:

class Solution {public int rob(int[] nums) {int len=nums.length;if(nums==null || len==0) return 0;if(len==1) return nums[0];return Math.max(robAction(nums,0,len-1),robAction(nums,1,len));}public int robAction(int[] nums, int start, int end){int x=0,y=0,z=0;for(int i=start;i<end;i++){z=Math.max(x+nums[i],y);x=y;y=z;}return z;}
}

337.打家劫舍III

思路:记录树上每个节点状态的变化,使用一个长度为2的数组,记录当前节点偷与不偷所得到的的最大金钱。

以递归三部曲为框架,融合动规五部曲的进行分析。

1、确定递归函数的参数和返回值
传入参数为当前节点,返回值是一个长度为2的数组。
即dp数组(dp table)以及下标的含义:下标为0记录不偷该节点所得到的的最大金钱,下标为1记录偷该节点所得到的的最大金钱。

2、确定终止条件
空节点无论偷还是不偷都是0,所以返回0。
相当于dp数组的初始化。

3、确定遍历顺序
使用后序遍历, 因为要通过递归函数的返回值来做下一步计算。
通过递归左节点,得到左节点偷与不偷的金钱。
通过递归右节点,得到右节点偷与不偷的金钱。

4、确定单层递归的逻辑
如果是偷当前节点,那么左右孩子就不能偷,val1 = cur->val + left[0] + right[0];
如果不偷当前节点,那么左右孩子就可以偷,至于到底偷不偷一定是选一个最大的,所以:val2 = max(left[0], left[1]) + max(right[0], right[1]);

当前节点的状态就是{val2, val1}; 即:{不偷当前节点得到的最大金钱,偷当前节点得到的最大金钱}

5、举例推导dp数组

代码如下:

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {public int rob(TreeNode root) {int[] res=robAction(root);return Math.max(res[0],res[1]);}public int[] robAction(TreeNode root){int[] res=new int[2];if(root==null) return res;int[] left=robAction(root.left);int[] right=robAction(root.right);res[1]=root.val+left[0]+right[0];res[0]=Math.max(left[0],left[1])+Math.max(right[0],right[1]);return res;}
}
http://www.lryc.cn/news/456404.html

相关文章:

  • C0010.Qt5.15.2下载及安装方法
  • 制造企业MES管理系统的应用策略与实施路径
  • Halcon 3D应用 - 胶路提取
  • 【Redis】Redis线程模型
  • Electron构建桌面应用程序,服务于项目的自主学习记录(持续更新...
  • linux Load Average 计算
  • pandas常用数据格式IO性能对比
  • 【D3.js in Action 3 精译_031】3.5.2 DIY实战:在 Observable 平台实现带数据标签的 D3 条形图并改造单元测试模块
  • 华为OD机试真题-字符串分割
  • 编程技巧:提高代码健壮性与可维护性的关键方法(以 Shell 为例)
  • 【无标题】ReadableStream is not defined
  • 【JVM】高级篇
  • nacos1.4源码-服务发现、心跳机制
  • C++ 2D平台游戏开发案例
  • 【Webpack--019】TreeShaking
  • Docker基本操作命令
  • 开源计算器应用的全面测试计划:确保功能性和可靠性
  • uni.requestPayment 支付成功之后会走 wx.onAppRoute
  • 统⼀服务入口 - Gateway
  • QGraphicsWidget Class
  • 探讨最好用的AI工具:从日常到创新的应用
  • Python系统教程005(字符串的格式化输出)
  • 六款电脑远程控制软件分享,2024最热门软件合集,总有一款适合你!速来看!
  • 优质微信群不再难寻!掌握这些技巧就够了!
  • python - mysql操作
  • 基于Springboot+Vue的服装生产管理信息系统设计与实现(含源码数据库)
  • 75.【C语言】文件操作(2)
  • Redis 使用记录
  • IDEA实用小技巧
  • PEI转染试剂对血清的敏感性研究