leetcode hot100打家劫舍三

在这里插入图片描述
本题是打家劫舍的变形,数据结构是树形。涉及到树的题目一定要想清楚树的遍历顺序(前中后序)。之后再考虑利用动态规划来解决。

动态规划是一直记录状态,我们可以根据动态规划的数组来记录变化的状态,最终求的自己想要的节点的状态。这才是其最根本的地方。

而考虑树的遍历则一般需要采用递归。所以本题是树形dp,采用递归方式遍历二叉树,并采用动态规划记录状态转移。

本题是相邻的节点不能偷,也就是一个被偷的节点的父节点和子节点都不能偷。那么我们应该采用后序遍历(左右中),先遍历左右节点,然后再返回中间节点确定偷还是不偷,这样才是最方便的。

这里dp数组就是一个长度为2的数组,就是两个状态,dp[0]表示当前节点偷,dp[1]表示当前节点不偷。比如,root[0]就是根节点偷。(注意:root[],left[],right[]都是长度为2的dp数组,都表示状态偷还是不偷)

然后我们想根节点root,如果根节点偷,那么其子节点一定不能偷,所以root[0] = root.val+left[0]+right[0]。如果根节点不偷,那么他的子节点可以偷也可以不偷,这时候应该取偷与不偷的最大值。root[1] = Math.max(left[0],left[1]) + Math.max(right[0],right[1])。

上述的公式实际上是根节点(其实就是每次递归的时候的中间节点的处理逻辑),我们树的遍历顺序是后序,只有把左右节点的数据获取到才能进行判断,这也是我们为什么选择后序遍历的原因。

针对左右节点,我们应该采用递归一直获取到最后一层的左右节点,然后开始判断即可(类比二叉树的后序遍历)
在这里插入图片描述

// 不偷:Max(左孩子不偷,左孩子偷) + Max(右孩子不偷,右孩子偷)
    // root[0] = Math.max(rob(root.left)[0], rob(root.left)[1]) +
    // Math.max(rob(root.right)[0], rob(root.right)[1])
    // 偷:左孩子不偷+ 右孩子不偷 + 当前节点偷
    // root[1] = rob(root.left)[0] + rob(root.right)[0] + root.val;
    public int rob3(TreeNode root) {
        int[] res = robAction1(root);
        return Math.max(res[0], res[1]);
    }

    int[] robAction1(TreeNode root) {
        int res[] = new int[2];
        if (root == null)
            return res;

        int[] left = robAction1(root.left);
        int[] right = robAction1(root.right);

        res[0] = Math.max(left[0], left[1]) + Math.max(right[0], right[1]);
        res[1] = root.val + left[0] + right[0];
        return res;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/403846.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Surely Vue Table表格css、js方法去除水印

文章目录 Surely Vue Table表格css、js方法去除水印用法 css 去除js去除 Surely Vue Table表格css、js方法去除水印 "surely-vue/table": "^4.2.7","ant-design-vue": "^2.1.2",用法 在main.ts文件中全局引入 import STable from su…

STM32-点亮 LED

目录 1 、电路构成及原理图 2 、编写实现代码 3、代码讲解 4、烧录到开发板调试、验证代码 5、检验效果 本人使用的是朗峰 STM32F103 系列开发板,此笔记基于这款开发板记录。 1 、电路构成及原理图 首先,通过朗峰 F1 开发板 LED 部分原理图看到…

VSCode-更改系统默认路径

修改vscode中的默认扩展路径:"%USERPROFILE%\.vscode" 打开目录C:\用户\电脑用户名,将.vscode文件剪切至D:\VSCode文件夹下 用管理员身份打开cmd.exe命令界面输入mklink /D "%USERPROFILE%\.vscode" "D:\VSCode\.vscode\"…

[corCTF 2022] CoRJail: From Null Byte Overflow To Docker Escape

前言 题目来源:竞赛官网 – 建议这里下载,文件系统/带符号的 vmlinux 给了 参考 [corCTF 2022] CoRJail: From Null Byte Overflow To Docker Escape Exploiting poll_list Objects In The Linux Kernel – 原作者文章,poll_list 利用方式…

如何在rust中输出日志:在rust中打印日志的各种方式对比

有许多库可以在 Rust 中输出日志,有时很难选择该使用哪一个。当 println! 、 dbg! 和 eprintln! 无法解决问题时,找到一种方便记录日志的方法就很重要,尤其是在生产级应用程序中。本文将帮助您深入了解在 Rust 日志记录方面最适合您的用例的日…

什么是Elasticsearch SQL

什么是Elasticsearch SQL 一. 介绍二. SQL 入门 前言 这是我在这个网站整理的笔记,有错误的地方请指出,关注我,接下来还会持续更新。 作者:神的孩子都在歌唱 一. 介绍 Elasticsearch SQL 是一个 X-Pack 组件,允许针对 Elasticsea…

OpenAI文生视频大模型Sora概述

Sora,美国人工智能研究公司OpenAI发布的人工智能文生视频大模型(但OpenAI并未单纯将其视为视频模型,而是作为“世界模拟器” ),于2024年2月15日(美国当地时间)正式对外发布。 Sora可以根据用户…

张驰咨询:餐饮业如何通过六西格玛培训增加利润

在当前的餐饮业,企业面临着一系列挑战,这些挑战可能会阻碍业务的成长和盈利能力。六西格玛培训提供了一套解决方案,能够帮助企业克服这些困境。让我们深入探讨一下餐饮业的具体困境以及六西格玛如何提供帮助。 一、餐饮业的挑战 顾客满意度…

localhost和127.0.0.1的区别是什么?

localhost和127.0.0.1的区别是什么? 前端同学本地调试的时候,应该没少和localhost打交道吧,只需要执行 npm run 就能在浏览器中打开你的页面窗口,地址栏显示的就是这个 http://localhost:xxx/index.html 可能大家只是用&#xff…

跨越千年医学对话:用AI技术解锁中医古籍知识,构建能够精准问答的智能语言模型,成就专业级古籍解读助手(LLAMA)

跨越千年医学对话:用AI技术解锁中医古籍知识,构建能够精准问答的智能语言模型,成就专业级古籍解读助手(LLAMA) 介绍:首先在 Ziya-LLaMA-13B-V1基线模型的基础上加入中医教材、中医各类网站数据等语料库&am…

JavaScript中的内存泄漏

一、是什么 内存泄漏(Memory leak)是在计算机科学中,由于疏忽或错误造成程序未能释放已经不再使用的内存 并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,导致在释放该段内存之前就失…

目前最先进的家庭取暖设备 南方取暖用什么电器好

在寒冷的冬季,家庭取暖成为了每个人关注的焦点。为了迎合消费者对舒适取暖环境的需求,市场上涌现出了多种家庭取暖设备。其中,取暖器成为目前最先进的家庭取暖设备之一。小编将向大家推荐五个顶尖品牌的取暖器。 1. 斯帝沃取暖器 英国斯帝沃&…

【寸铁的刷题笔记】树、dfs、bfs、回溯、递归(一)

【寸铁的刷题笔记】树、dfs、bfs、回溯、递归(一) 大家好 我是寸铁👊 总结了一篇刷题关于树、dfs、bfs、回溯、递归的文章✨ 喜欢的小伙伴可以点点关注 💝 105. 从前序与中序遍历序列构造二叉树 模拟分析图 代码实现 /*** Definition for a binary tre…

Windows系统中定时执行python脚本

背景:本地Windows系统指定目录下会有文件的修改新增,这些变化的文件需要定时的被上传到git仓库中,这样不需要每次变更手动上传了。 首先编写一个检测文件夹下文件变化并且上传git仓库的python脚本(确保你已经在E:\edc_workspace\data_edc_et…

uniapp-提现功能(demo)

页面布局 提现页面 有一个输入框 一个提现按钮 一段提现全部的文字 首先用v-model 和data内的数据双向绑定 输入框逻辑分析 输入框的逻辑 为了符合日常输出 所以要对输入框加一些条件限制 因为是提现 所以对输入的字符做筛选,只允许出现小数点和数字 这里用正则实现的 小数点…

力扣面试经典150 —— 1-5题

力扣面试经典150题在 VScode 中安装 LeetCode 插件即可使用 VScode 刷题,安装 Debug LeetCode 插件可以免费 debug本文使用 python 语言解题,文中 “数组” 通常指 python 列表;文中 “指针” 通常指 python 列表索引 文章目录 1. [简单] 合并…

TongWEB(东方通),部署WEB前后端项目步骤

我的系统: 银河麒麟桌面系统V10(SP1)(兆芯) 环境需要搭建好,什么redis,数据库等 1.准备项目前端war包 (我后端项目本就是war部署,jar转war自行百度一下吧) 进入前端打包好的dist文件夹,创建一个文件夹 WEB-INF ,再在 WEB-INF 里创建一个 web.xml 文件,文件内容: <web-…

谁说常量字符串不可修改

哈喽&#xff0c;我是子牙&#xff0c;一个很卷的硬核男人 深入研究计算机底层、Windows内核、Linux内核、Hotspot源码……聚焦做那些大家想学没地方学的课程。为了保证课程质量及教学效果&#xff0c;一年磨一剑&#xff0c;三年先后做了这些课程&#xff1a;手写JVM、手写OS、…

接口性能优化的小技巧

目录 1.索引 1.1 没加索引 1.2 索引没生效 1.3 选错索引 2. sql优化 3. 远程调用 3.1 并行调用 3.2 数据异构 4. 重复调用 4.1 循环查数据库 4.2 死循环 4.3 无限递归 5. 异步处理 5.1 线程池 5.2 mq 6. 避免大事务 7. 锁粒度 7.1 synchronized 7.2 redis分…

git 使用总结

文章目录 git merge 和 git rebasegit mergegit rebase总结 git merge 和 git rebase git merge git merge 最终效果说明&#xff1a; 假设有一个仓库情况如下&#xff0c;现需要进行 merge&#xff1a; merge 操作流程&#xff1a; merge 的回退操作&#xff1a; git reba…