leetcode 337 打家劫舍III

news/2024/11/19 23:13:24/
题目

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

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

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

示例

输入: root = [3,2,3,null,3,null,1]
输出: 7
解释: 小偷一晚能够盗取的最高金额 3 + 3 + 1 = 7

解析

小偷要是有这水平,干点什么不好。。。
首先这道题是二叉树中的动态规划,已知二叉树的递归法有递归三部曲,动态规划有动规五部曲,需要把二者结合分析一下:
1.确定递归函数的参数和返回值
参数肯定就是传进来的cur,返回值是一个数组,用来表示对于cur,偷和不偷分别得到的金钱最大值,也是是我们的dp数组,因此,对应的dp数组的含义是:
下标为0记录不偷该节点所得到的的最大金钱,下标为1记录偷该节点所得到的的最大金钱。
2.确定终止条件
节点若为空,则返回,也相当于dp数组初始化了
3.确定遍历顺序
本题要使用后序遍历,因为要拿到递归函数的返回值,来进行下一步的运算
4.确定单层递归的逻辑
对于当前节点,有两种方式:偷或者是不偷
偷:则其左右孩子节点就不能偷了,即 val1 = cu.val + left[0] + right[0];
不偷:从左右孩子中偷一个最大的,即 val2 = max(left[0], left[1]) + max(right[0], right[1]);
注意:上面的0和1分别代表的是不偷和偷

/*** Definition for a binary tree node.* type TreeNode struct {*     Val int*     Left *TreeNode*     Right *TreeNode* }*/
func rob(root *TreeNode) int {res := robTree(root)return max(res[0], res[1])
}func max(a, b int) int {if a > b {return a} return b
}func robTree(cur *TreeNode) []int{if cur == nil {return []int{0, 0}}// 二叉树后序遍历left := robTree(cur.Left)right := robTree(cur.Right)// 考虑去偷当前的屋子robCur := cur.Val + left[0] + right[0]// 考虑不偷当前的屋子notRobCur := max(left[0], left[1]) + max(right[0], right[1])return []int{notRobCur, robCur}
}

http://www.ppmy.cn/news/5619.html

相关文章

【C++入门基础(上)】

Cross the stars over the moon to meet your better-self. 目录 1 命名空间 1.1 命名空间定义 1.2 命名空间使用 1.2.1 加命名空间名称及作用域限定符 1.2.2 使用using将命名空间中成员引入 1.2.3 使用using namespace 命名空间名称引入 2 C输入&&输出 3 缺省参数…

Redis集群的三种方式详解(附优缺点及原理区别)

Redis提供了三种集群方式,下面我重点详解Redis三种集群方式的原理及优缺点等区别mikechen 目录 Redis主从复制模式Redis哨兵模式Redis集群模式 Redis主从复制模式 1.Redis主从复制定义 主从模式是三种模式中最简单的,主从模式指的是使用一个Redis实例…

【Java枚举类与注解】——一篇文章读懂枚举类与注解

文章目录2.枚举2.1概述2.2定义格式2.3枚举的特点2.4枚举的方法3.注解3.1概述3.2自定义注解3.3 元注解2.枚举 2.1概述 为了间接的表示一些固定的值,Java就给我们提供了枚举,是指将变量的值一一列出来,变量的值只限于列举出来的值的范围内。 …

Spring事件处理

在实际业务开发中,有时候复杂性的业务之间需要解耦,常用的方法:同步、异步、MQ。但 MQ 重啊,非必要不提升架构复杂度。 针对同步和异步使用方式:1.定时器 2.Spring Event. Spring Event: 观察者…

STM32的ST-link调试下载,各种调试接口硬件介绍

调试原理 STM32F-10X使用M3内核,该内核支持复杂的同i傲视操作,硬件调试模块允许在取指令(指令单步运行)或访问数据(数据断电时)使得内核停止。在内核停止时,内核状态都可被查询,完成…

数理统计期末复习笔记(一)

数理统计期末复习笔记 主要内容: 数据压缩,点估计,假设检验,区间检验 Reference: Statistical Inference, Casella&Berger Chapter 6 Data Reduction(数据压缩) 随机样本: 无限样本&…

记录我の秋招之旅【23届 CV算法岗】

文章目录碎碎念春招实习华为实习魔幻秋招尘埃落定碎碎念 今年(2022年)的秋招不能说"非常困难"吧,只能说是"地狱难度",相信参与或者从侧面了解过的同学们也能感同身受。从今年的三月份开始着手秋招,期间也一直忙着实验室…

机器学习100天(十六):016 逻辑回归损失函数

机器学习 100 天,今天讲的是:逻辑回归损失函数。 一、如何找到最佳分类直线 讲完了逻辑回归基本原理之后,我们再来思考一个非常关键的问题:就是如何找到最佳的分类直线呢? 如图中所示,如何判断这三条直线哪个更好?线性回归里,我们可以用均方误差作为损失函数,选择均…