House Robber
2016-06-24 17:34
309 查看
这道题的意思是任何两个相连接的点不能同时被盗。
所以使用递归就可以了,需要记录每个节点的两种情况:
result数组中存的是每个节点算上自己的当前节点的值result[1]和不算自己当前节点的值reslut[0]的情况。
1、不算自己节点,将比较 (node.left)左孩子 算左节点自己节点和 不算左节点自己节点的,去这两种的最大值,然后在同样比较右节点(node.right)的情况。
2、算自己的节点,将现节点(node)和左孩子的resultl[0]和有孩子的resultr[0]相加。
最后得到根节点的result[0],result[1],最后输出最大值。
附上代码:
public class Solution {
public int rob(TreeNode root) {
int[] result=robCount(root);
return Math.max(result[0],result[1]);
}
public int [] robCount(TreeNode node){
if(node==null) return new int[]{0, 0};
int[] result=new int[2];
int[] resultl=robCount(node.left);
int[] resultr=robCount(node.right);
result[0]=Math.max(resultl[0],resultl[1])+Math.max(resultr[0],resultr[1]);//没有算进当前点
result[1]=node.val+resultl[0]+resultr[0];//当前节点算进去
return result;
}
}
所以使用递归就可以了,需要记录每个节点的两种情况:
result数组中存的是每个节点算上自己的当前节点的值result[1]和不算自己当前节点的值reslut[0]的情况。
1、不算自己节点,将比较 (node.left)左孩子 算左节点自己节点和 不算左节点自己节点的,去这两种的最大值,然后在同样比较右节点(node.right)的情况。
2、算自己的节点,将现节点(node)和左孩子的resultl[0]和有孩子的resultr[0]相加。
最后得到根节点的result[0],result[1],最后输出最大值。
附上代码:
public class Solution {
public int rob(TreeNode root) {
int[] result=robCount(root);
return Math.max(result[0],result[1]);
}
public int [] robCount(TreeNode node){
if(node==null) return new int[]{0, 0};
int[] result=new int[2];
int[] resultl=robCount(node.left);
int[] resultr=robCount(node.right);
result[0]=Math.max(resultl[0],resultl[1])+Math.max(resultr[0],resultr[1]);//没有算进当前点
result[1]=node.val+resultl[0]+resultr[0];//当前节点算进去
return result;
}
}
相关文章推荐
- AlarmManager系统服务
- Effective Java 之-----精确的答案与double&float
- 关于ECMall
- Linux operation strucutre
- 第16周阅读程序-文件操作
- 配置mail命令的IMAP和SMTP,接收邮件和发送邮件
- lxml.etree 入门
- 如何修改系统默认字体大小
- 7------cocos2dx 3.1.1 在线热更新 自动更新(AssetsManager)
- Android Studio快捷键和使用技巧
- Notification详解
- MDD:使用模型驱动开发方式进行快速开发(多图预警)
- eq,neq,gt,lt等表达式缩写
- phpcms(1)phpcms V9 MVC模式 与 URL访问解析(转)
- 安卓第一天,配置环境变量,安装sdk
- 进入界面的时候Scrollview自动滚动
- HttpClient 的使用
- static&&final
- window下的Vim-常见配置
- ORACLE 11G 备库传备库级联传递(cascade dg) 的配置方法