Java实现 LeetCode 337 打家劫舍 III(三)
337. 打家劫舍 III
在上次打劫完一条街道之后和一圈房屋后,小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为“根”。 除了“根”之外,每栋房子有且只有一个“父“房子与之相连。一番侦察之后,聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。 如果两个直接相连的房子在同一天晚上被打劫,房屋将自动报警。
计算在不触动警报的情况下,小偷一晚能够盗取的最高金额。
示例 1:
输入: [3,2,3,null,3,null,1]
3
/ \
2 3
\ \
3 1
输出: 7
解释: 小偷一晚能够盗取的最高金额 = 3 + 3 + 1 = 7.
示例 2:
输入: [3,4,5,1,3,null,1]
3
/ \
4 5
/ \ \
1 3 1
输出: 9
解释: 小偷一晚能够盗取的最高金额 = 4 + 5 = 9.
//递归思想(不要深入递归函数体,只需知道递归函数的功能,以及找到跳出递归的边界条件)
//思路:
//能盗取的最高金额为 抢劫该节点+抢劫该节点的左孩子的左右子树+抢劫该节点的右孩子的左右子树
//与 抢劫该节点的左子树+抢劫该节点的右子树的和 的最大值
//执行用时 1005ms 原因是出现了很多重复的计算,可使用动态规划解决
if(root == null) return 0;
int val = 0;
if(root.left != null) val += rob(root.left.left) + rob(root.left.right);
if(root.right != null) val += rob(root.right.left) + rob(root.right.right);
return Math.max(rob(root.left) + rob(root.right),val + root.val);
*/
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public int rob(TreeNode root) {
//动态规划
//思路:
//定义一个数组res,长度为2,res[0]表示不抢该节点可获得最大值,res[1]表示抢劫该节点可获得最大值
//方法helper(r)意为:在以r为根节点的树中,返回抢劫根节点与不抢劫根节点可获得的最大值
//执行用时 2ms
int[] res = helper(root);
return Math.max(res[0],res[1]);
}
public int[] helper(TreeNode r){
//边界条件,r为null时,跳出
if(r == null) return new int[2];
//对于以r.left为根的树,计算抢劫根节点(r.left)与不抢劫根节点可获得最大金额.
//left[0]则为不抢r.lrft可获得的最大金额,left[1]则为抢劫r.left可获得的最大金额 以下right[] 分析同理
int[] left = helper(r.left);
int[] right = helper(r.right);
int[] res = new int[2];
//计算不抢劫当前根节点可获得的最大金额(那么其左右子树可以随便抢)
res[0] = Math.max(left[0],left[1]) + Math.max(right[0],right[1]);
//计算若抢劫根节点可获得的最大金额(此时,其左右子树的根节点不能被抢)
res[1] = r.val + left[0] + right[0];
return res;
}
}
Java实现 LeetCode 337 打家劫舍 III(三)的更多相关文章
- Leetcode 337. 打家劫舍 III
题目链接 https://leetcode.com/problems/house-robber-iii/description/ 题目描述 在上次打劫完一条街道之后和一圈房屋后,小偷又发现了一个新的可 ...
- [LeetCode] 337. 打家劫舍 III (树形dp)
题目 在上次打劫完一条街道之后和一圈房屋后,小偷又发现了一个新的可行窃的地区.这个地区只有一个入口,我们称之为"根". 除了"根"之外,每栋房子有且只有一个&q ...
- leetcode 337. 打家劫舍iii
题目描述: 在上次打劫完一条街道之后和一圈房屋后,小偷又发现了一个新的可行窃的地区.这个地区只有一个入口,我们称之为“根”. 除了“根”之外,每栋房子有且只有一个“父“房子与之相连.一番侦察之后,聪明 ...
- LeetCode 337. 打家劫舍 III(House Robber III)
题目描述 小偷又发现一个新的可行窃的地点. 这个地区只有一个入口,称为“根”. 除了根部之外,每栋房子有且只有一个父房子. 一番侦察之后,聪明的小偷意识到“这个地方的所有房屋形成了一棵二叉树”. 如果 ...
- 刷题-力扣-337. 打家劫舍 III
337. 打家劫舍 III 题目链接 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/house-robber-iii 著作权归领扣网络所有.商 ...
- 力扣337——打家劫舍 III
这一篇也是基于"打家劫舍"的扩展,需要针对特殊情况特殊考虑,当然其本质还是动态规划,优化时需要考虑数据结构. 原题 在上次打劫完一条街道之后和一圈房屋后,小偷又发现了一个新的可行窃 ...
- Java实现 LeetCode 630 课程表 III(大小堆)
630. 课程表 III 这里有 n 门不同的在线课程,他们按从 1 到 n 编号.每一门课程有一定的持续上课时间(课程时间)t 以及关闭时间第 d 天.一门课要持续学习 t 天直到第 d 天时要完成 ...
- Java实现 LeetCode 213 打家劫舍 II(二)
213. 打家劫舍 II 你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金.这个地方所有的房屋都围成一圈,这意味着第一个房屋和最后一个房屋是紧挨着的.同时,相邻的房屋装有相互连通的防盗 ...
- Java实现 LeetCode 198 打家劫舍
198. 打家劫舍 你是一个专业的小偷,计划偷窃沿街的房屋.每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报 ...
随机推荐
- Queue-PriorityQueue源码解析
Queue队列通常是先进先出(FIFO),但也有特殊的非FIFO,如本文也分析的PriorityQueue. Queue接口 Queue接口定义的方法: 添加元素接口: add(E e) -> ...
- Springboot中修改.properties文件为.yml文件时项目不能运行问题
可能很多小伙伴会考虑环境配置的问题,maven版本.idea版本什么的,其实没有必要 只要你之前.ies时能运行,那么环境配置就没有问题 不能运行的原因,一定是你的.yml文件的格式问题 .yml文件 ...
- window 10电脑永不熄屏的方法
你的电脑是不是人还没有离开一会儿,经常锁屏,输入密码??反复反复,特别的折磨人,别急,下面我教你,告别反复,从此我的电脑我做主. 第一步,打开设置,进入个性化界面,点击锁屏界面,往下滑 第二步,找到屏 ...
- 2018-06-18 sublime代码编辑器
sublime代码编辑器:主流前端开发编辑器,体积较小,运行速度快,文本功能强大,支持VI扩展,linux下面有个自带的文本编辑神器,名字叫做:vi ,熟练vi模式可以大量减少使用鼠标的次数,从而增加 ...
- ql的python学习之路-day5
文件操作 文件操作流程: 1.打开文件得到文件句柄并赋值变量 2.通过句柄对文件进行操作 3.关闭文件 打开的只是储存在计算机里的文件对象,必须赋值一个变量才能操作,变量通常用f表示,赋值f的文件对象 ...
- python 之模块引入
模块引入: 1.同级引入 如 ac_first.py 引入ac_second.py:只需直接 import ac_second 即可 这种情况 不论是 python ac\ac_first.py 还是 ...
- Java基础之数据类型
一.数据类型 基本数据类型介绍 byte 1字节 char 2字节 short 2字节 int 4字节 long 8字节 float 4字节 double 8字节 以上有Java中八大基本类型的7种, ...
- Redis学习笔记(十二) 复制(上)
偷个懒,晚上工作忙的太晚,整个复制功能的内容还没有写完,这里先说一下复制功能的简单应用. 在Redis中,用户可以通过执行SLAVEOF命令或者设置slaveof选项,让一个服务器去复制另一个服务器, ...
- ABAP基础3:OPENSQL
select result from source where condition group by fileds having condition order by fields into targ ...
- php RSA和AES加密算法
一.RSA加密 RSA只说PHP中的应用,详细的算法原理解释,请自行百度,或者参考(RSA加密算法-详细解释以及公钥加密为什么每次都不一样) 总结:公钥加密.私钥解密.私钥签名.公钥验签. 注意: 1 ...