337. 打家劫舍 III Krains 2020-08-05 10:18:45 动态规划
时间:2022-07-22
本文章向大家介绍337. 打家劫舍 III Krains 2020-08-05 10:18:45 动态规划,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
# 题目链接
# 记忆化递归
解题思路
- 对于一个结点,可偷可不偷,用dfs搜索所有可能方案,返回一个最大值
- 对于一个结点,对该结点以及其子树行窃所能偷的最大值是确定的,因此可以使用记忆化,以当前结点为key记录当前结点所能行窃的最大值
class Solution {
Map<TreeNode, Integer> memo = new HashMap<>();
public int rob(TreeNode root) {
return helper(root);
}
public int helper(TreeNode root){
if(root == null)
return 0;
if(memo.containsKey(root))
return memo.get(root);
// t1代表对当前root行窃,行窃后就不能够对其相邻的左右孩子动手
// 因此,直接跳过其左右孩子
int t1 = root.val;
if(root.left != null)
t1 += helper(root.left.left) + helper(root.left.right);
if(root.right != null)
t1 += helper(root.right.left) + helper(root.right.right);
// t2表示不对当前root行窃
int t2 = 0;
t2 += helper(root.left) + helper(root.right);
// 取最大值,并记忆
t1 = Math.max(t1, t2);
memo.put(root, t1);
return t1;
}
}
# 动态规划
解题思路
- 用一个数组a记录状态,a[0]表示对当前root行窃的最大值,a[1]不对当前root行窃的最大值
- 假设root左右结点返回的状态分别为left,right,那么
-
a[0]=root.val+left[1]+right[1]
,对root行窃,那么对其相邻的左右孩子只能不行窃 -
a[1]=max(left[0],left[1])+max(right[0],right[1])
,对root不行窃,对其左右孩子可偷可不偷,选择偷或不偷的最大值
-
class Solution {
public int rob(TreeNode root) {
int[] ans = helper(root);
return Math.max(ans[0], ans[1]);
}
public int[] helper(TreeNode root){
if(root == null)
return new int[]{0, 0};
int[] left = helper(root.left);
int[] right = helper(root.right);
return new int[]{root.val + left[1] + right[1],
Math.max(left[0], left[1]) + Math.max(right[0], right[1])};
}
}
- ODL应用开发之MD-SAL中级教程
- Sql参数是一个list的最佳实践
- MyBatis 配置输出日志,不输出SQL问题解决
- lombok让你提高代码整洁度的神器附教程及原理分析
- mvn编译的时候一个破错误,google只有3个结果maven : Failed to install metadata project Could not parse metadata maven-
- 读书|《Mastering Machine Learning with Python in Six Steps》
- 几种简单的文本数据预处理方法
- Fiddler中显示IP方法
- readlink: command not found 解决方案
- Java 并发编程系列: CountDownLatch (上厕所的案例)
- 详解ANGULAR2组件中的变化检测机制(对比ANGULAR1的脏检测)
- 如何快速查看github代码库中第一次commit的记录
- 更换包管理工具npm为yarn
- 【精选】使用Cryptory分析影响加密货币价格的因素(区块链系列3)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Win10 LTSC 激活方法 | Win10专业版(永久激活)长期服务版 LTSC 2019密钥
- Nginx代理以及面向未来的HTTP
- git的基本使用
- 一、玩转Git三剑客-Git基础
- Docker和k8s的故障排除和监控利器 Weave-Scope服务
- docker 配置Consul+registrator实时服务发现
- 使用Docker搭建Zookeeper集群
- GDCRNATools内置的gdc-client不好用
- 字符编码与字符串表达式
- 关于批次效应矫正后出现负值
- 在SAP WebIDE里使用Fiori Elements快速开发SAP UI5应用
- SAP Fiori Elements里的Smart Table工作原理解析
- SAP Fiori Elements里Smart Link工作原理介绍
- SAP CDS view自学教程之六:如何在CDS view里消费table function
- 如何构建一个100 Gbit(无丢包)连续数据包记录器[Part3]