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

Leetcode 337 打家劫舍 III

题意理解:

        小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为 root 。

除了 root 之外,每栋房子有且只有一个“父“房子与之相连。一番侦察之后,聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。 如果 两个直接相连的房子在同一天晚上被打劫 ,房屋将自动报警。

        给定二叉树的 root 。返回 在不触动警报的情况下 ,小偷能够盗取的最高金额 。

        

        这里的打家劫舍不同之处在于:状态转移是在一颗树上

        限制要求是:相邻不能偷

        所以:

        偷了根节点,左右孩子节点不能偷

        偷了左右孩子,根节点不能偷

解题思路:

        这里使用回溯法来遍历每个节点

        每个节点都有两种状态:偷当前节点,和不偷当前节点

        所以我们在每层设置一个dp数组: dp[0]表示不偷所能获得的最大金额, dp[1]表示偷所能获得的最大金额。

        所以每层返回一个dp数组。

        dp[0]=max(偷左,不偷左)+ max(偷右,不偷右)

        dp[1]=不偷左+不偷右+根

        最后的结果是:

        max(dp[0],dp[1])

1.解题

    public int rob(TreeNode root) {
        int[] dp=new int[2];
        dp=travel(root);
        return Math.max(dp[0],dp[1]);
    }

    public int[] travel(TreeNode root){
        int[] dp=new int[2];
        if(root==null) return dp;
        int[] left_dp=travel(root.left);
        int[] right_dp=travel(root.right);
        dp[0]=Math.max(left_dp[0],left_dp[1])+Math.max(right_dp[0],right_dp[1]);
        dp[1]=left_dp[0]+right_dp[0]+root.val;
        return dp;
    }

2.分析

时间复杂度:O(n)

空间复杂度:O(n)


http://www.kler.cn/a/233641.html

相关文章:

  • 设计模式之责任链模式(Chain Of Responsibility)
  • 三正科技笔试题
  • 深入理解BERT模型配置:BertConfig类详解
  • Pycharm PyQt5 环境搭建创建第一个Hello程序
  • Springboot集成syslog+logstash收集日志到ES
  • 数据结构-集合
  • 软件测试学习笔记-使用jmeter进行性能测试
  • ChatGPT高效提问—prompt常见用法(续篇四)
  • Acwing831KMP字符串
  • 【极数系列】Flink集成KafkaSink 实时输出数据(11)
  • 神经网络 | CNN 与 RNN——深度学习主力军
  • Redis篇之过期淘汰策略
  • springboot微信小程序 uniapp学习资料分享系统v9uy4
  • 【大厂AI课学习笔记】【1.5 AI技术领域】(8)文本分类
  • containerd中文翻译系列(二十一)用户命名空间
  • 一次显著的性能提升,从8s到0.7s
  • ClickHouse--02--安装
  • C++进阶(十三)异常
  • JAVA设计模式之代理模式详解
  • IDEA中Git的使用小技巧-Toolbar(工具栏)的设置
  • JVM 性能调优 - 常用的垃圾回收器(6)
  • MyBatisPlus之分页查询及Service接口运用
  • 【docker常见命令】
  • 【QT+QGIS跨平台编译】之三十一:【FreeXL+Qt跨平台编译】(一套代码、一套框架,跨平台编译)
  • 项目02《游戏-11-开发》Unity3D
  • Vue3.4+element-plus2.5 + Vite 搭建教程整理