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

LeetCode337. 打家劫舍III

// 很好的一道题目,既考察递归又考察动归
// 这个版本超时了,原因是暴搜
// 很显然这里使用的是前序,那是不是应该考虑后序?public int rob(TreeNode root) {if (root == null) {return 0;}if (root.left == null && root.right == null) {return root.val;}if (root.left != null && root.right != null) {return Math.max(rob(root.left) + rob(root.right), root.val + rob(root.left.left) + rob(root.left.right) + rob(root.right.left) + rob(root.right.right));}if (root.left != null) {return Math.max(rob(root.left) + rob(root.right), root.val + rob(root.left.left) + rob(root.left.right));}return Math.max(rob(root.left) + rob(root.right), root.val + rob(root.right.left) + rob(root.right.right));}

上面的代码其实非常的丑陋,就算暴搜也不应该这样写,而是这样

public int rob(TreeNode root) {if (root == null)return 0;int money = root.val;if (root.left != null) {money += rob(root.left.left) + rob(root.left.right);}if (root.right != null) {money += rob(root.right.left) + rob(root.right.right);}return Math.max(money, rob(root.left) + rob(root.right));}

但这题说到底是树形DP题目,最优解法应该是使用DP,如下

    public int rob(TreeNode root) {int[] res = robHelper(root);return Math.max(res[0], res[1]); }private int[] robHelper(TreeNode root) {int[] res = new int[2];if (root == null) {return res;}int[] left = robHelper(root.left);int[] right = robHelper(root.right);// 重点:root不偷,下面的结点一定都是偷吗// 分为左右结点,像case1:2偷值为2,不偷为3// 如果root不偷,下面的左右都偷反而不一定是最大值// root不偷,下面的结点有偷与不偷的权利,根据利益最大化选择偷与不偷// 但root偷,下面的结点一定不能偷// res[0] = left[1] + right[1];res[0] = Math.max(left[0], left[1]) + Math.max(right[0], right[1]);res[1] = root.val + left[0] + right[0];return res;}
http://www.lryc.cn/news/444065.html

相关文章:

  • python基础(二) 包和import
  • 选址模型 | 基于混沌模拟退火粒子群优化算法的电动汽车充电站选址与定容(Matlab)
  • WPF入门教学十 资源与字典
  • Ubuntu20.04配置NVIDIA+CUDA12.2+CUDNN【附所有下载资源】【亲测有效】【非常详细】
  • Golang | Leetcode Golang题解之第424题替换后的最长重复字符
  • 软考高级:系统安全 -区块链特点:去中心化、开放性、自治性、安全性、匿名性
  • Pandas 数据分析入门详解
  • 【网络】高级IO——epoll版本TCP服务器初阶
  • xml中的转义字符
  • Webpack:现代前端项目的强大打包工具
  • 以root用户登陆ubuntu的桌面环境
  • 《系统架构设计师教程(第2版)》第17章-通信系统架构设计理论与实践-04-其他网络架构(存储网络架构、软件定义网络架构)
  • 大话Python|基础语法(上)
  • crosscrossover24支持的游戏有那些
  • 如何免费调用GPT API进行自然语言处理
  • vue无感刷新Token并重新请求
  • C++和OpenGL实现3D游戏编程【连载10】——纹理的半透明显示
  • 50页PPT麦肯锡精益运营转型五步法
  • Fyne ( go跨平台GUI )中文文档-小部件 (五)
  • GUI编程19:贪吃蛇小游戏及GUI总结
  • linux StarRocks 安装
  • 解决RabbitMQ设置x-max-length队列最大长度后不进入死信队列
  • 【解决】chrome 谷歌浏览器,鼠标点击任何区域都是 Input 输入框的状态,能看到输入的光标
  • 使用python操作数据库
  • [Redis] 渐进式遍历+使用jedis操作Redis+使用Spring操作Redis
  • 排序----数据结构
  • Crack道路裂缝检测数据集——目标检测数据集
  • 10.3拉普拉斯金字塔
  • redis为什么不使用一致性hash
  • Vue.js与Flask/Django后端配合