LeetCode刷题之HOT100之打家劫舍Ⅲ

news2024/11/16 16:19:47

2024 7/13 七月就要过去一半了,伴随着蝉鸣,酷暑被窗户隔离,我坐在凳子上,有一只蚊子不愿意放过我。

1、题目描述

在这里插入图片描述

2、算法分析

前面做过打家劫舍Ⅱ,今天来做打家劫舍Ⅲ,小偷也是越来越聪明了,意识到房子的排列类似二叉树,这小偷之前大概率是程序员,我就说吧,计算机就业就是这么广。JAVA炒粉、JAVA烧烤、JAVA外卖、JAVA探花也是应运而生。
Anyway,让我们来分析这题。
这题啊数据结构就是二叉树,只不过除了根节点,其他父节点就只有一个儿子。两个连着的不能都偷,怎么偷才能偷最多米呢?
算法步骤

  1. 初始化:创建两个哈希表 fg,用于存储每个节点的最大价值(偷或不偷)。
  2. 深度优先搜索(DFS): 对每个节点,首先递归地处理其左子树和右子树。 更新 f[node]:如果偷取当前节点node,则当前节点的价值加上不偷取左右子节点左右子树的最大价值(即 g[node.left]g[node.right])。
    更新 g[node]:不偷取当前节点 node 时,取偷取或不偷取左子节点的较大值加上偷取或不偷取右子节点的较大值(即
    Math.max(f[node.left], g[node.left]) + Math.max(f[node.right],g[node.right]))
  3. 返回结果:在遍历完整棵树后,f[root]g[root]分别表示偷取根节点和不偷取根节点时的最大价值。最终答案取两者中的较大值,即 Math.max(f.getOrDefault(root,0), g.getOrDefault(root, 0))

3、代码

 // f[node]表示偷当前节点node时的最大金额  
    Map<TreeNode, Integer> f = new HashMap<TreeNode, Integer>();
    // g[node]表示不偷当前节点node时的最大金额
    Map<TreeNode, Integer> g = new HashMap<TreeNode, Integer>();

    // 主函数,返回偷窃二叉树能获得的最大金额
    public int rob(TreeNode root) {
        // 执行深度优先搜索来填充f和g的值
        dfs(root);
        // 返回偷或不偷根节点时的较大值,因为小偷可以选择从根节点开始偷或不偷
        return Math.max(f.getOrDefault(root, 0), g.getOrDefault(root, 0));
    }

    // 深度优先搜索函数,用于计算每个节点的f和g值
    public void dfs(TreeNode node){
        // 如果节点为空,则直接返回
        if(node == null){
            return;
        }
        // 递归计算左子树的f和g值
        dfs(node.left);
        // 递归计算右子树的f和g值
        dfs(node.right);
        // 计算当前节点node偷时的最大金额:节点值加上不偷左右子节点时的最大金额
        f.put(node, node.val + g.getOrDefault(node.left, 0) + g.getOrDefault(node.right, 0));
        // 计算当前节点node不偷时的最大金额:左右子节点偷与不偷的较大值之和
        g.put(node, Math.max(f.getOrDefault(node.left, 0), g.getOrDefault(node.left, 0)) + 
        Math.max(f.getOrDefault(node.right, 0), g.getOrDefault(node.right, 0)));
    }

4、复杂度分析

  • 时间复杂度 O(n)
  • 空间复杂度 O(n):由于递归会使用到栈空间,空间代价是 O(n),哈希表的空间代价也是 O(n),故空间复杂度也是 O(n)。

okok,做完了,拜拜啦!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

集训 Day 3 总结 虚树 + dfs tree + 基环树

虚树 虚树&#xff0c;顾名思义是 只关注原树上的某些 关键点&#xff0c;在保留原树祖孙关系的前提下建出的一棵边数、点数大大减少的树 适用于优化某些在整棵树上进行 d p dp dp、 d f s dfs dfs 的问题 通常是题目中出现多次询问&#xff0c;每次给出树上的一些关键点&a…

唯一索引插入引发的死锁问题

MySQL 8.4.0 RR隔离级别 场景复现 分析下面SQL死锁的场景 对于switch表&#xff0c;有主键索引id和唯一索引(uid、type)。 CREATE TABLE switch (id int NOT NULL AUTO_INCREMENT COMMENT Unique identifier for each switch,uid int NOT NULL COMMENT User ID associated wi…

Autoware 定位之基于ARTag的landmark定位(六)

Tip: 如果你在进行深度学习、自动驾驶、模型推理、微调或AI绘画出图等任务&#xff0c;并且需要GPU资源&#xff0c;可以考虑使用UCloud云计算旗下的Compshare的GPU算力云平台。他们提供高性价比的4090 GPU&#xff0c;按时收费每卡2.6元&#xff0c;月卡只需要1.7元每小时&…

AI大模型来了,低代码还有机会吗?

AI大模型的突飞猛进&#xff0c;不仅引领了技术的革新浪潮&#xff0c;也为各行各业的发展带来了前所未有的挑战与机遇。近年来&#xff0c;随着人工智能技术的不断进步&#xff0c;关于各行各业将被AI取代的论调此起彼伏&#xff0c;引发了许多从业者的不安。 几年前&#xf…

Flowable-流程图标与流程演示

BPMN 2.0是业务流程建模符号2.0的缩写。它由Business Process Management Initiative这个非营利协会创建并不断发展。作为一种标识&#xff0c;BPMN 2.0是使用一些符号来明确业务流程设计流程图的一整套符号规范&#xff0c;它能增进业务建模时的沟通效率。目前BPMN2.0是最新的…

AI人工智能填词,唱响心中独特旋律

在音乐的无垠宇宙中&#xff0c;每个人的内心都有一段独一无二的旋律在悄然回荡。而如今&#xff0c;人工智能填词正以其神奇的力量&#xff0c;帮助我们将这些深藏心底的旋律化作动人的歌词&#xff0c;让它们得以放声歌唱。 “妙笔生词智能写歌词软件&#xff08;veve522&am…

【QT】布局管理器

布局管理器 布局管理器1. 垂直布局2. 水平布局3. 网格布局4. 表单布局5. Spacer 布局管理器 之前使⽤ Qt 在界⾯上创建的控件, 都是通过 “绝对定位” 的⽅式来设定的&#xff1b;也就是每个控件所在的位置, 都需要计算坐标, 最终通过 setGeometry 或者 move ⽅式摆放过去。 …

一文彻底学会Vue3路由:全面讲解路由流程、路由模式、传参等——全栈开发之路--前端篇(7)路由详解

全栈开发一条龙——前端篇 第一篇&#xff1a;框架确定、ide设置与项目创建 第二篇&#xff1a;介绍项目文件意义、组件结构与导入以及setup的引入。 第三篇&#xff1a;setup语法&#xff0c;设置响应式数据。 第四篇&#xff1a;数据绑定、计算属性和watch监视 第五篇 : 组件…

pytorch-pytorch之LSTM

目录 1. nn.LSTM2. nn.LSTMCell 1. nn.LSTM 初始化函数输入参数与RNN相同&#xff0c;分别是input_size&#xff0c;hidden_size和num_layer foward函数也与RNN类似&#xff0c;只不过返回值除了out外&#xff0c;ht变为(ht,ct) 代码见下图&#xff1a; 2. nn.LSTMCell 初…

SQL优化-索引

什么是索引&#xff1f; 索引&#xff08; index &#xff09;是帮助 MySQL 高效获取数据的数据结构 ( 有序 ) 。在数据之外&#xff0c;数据库系统还维护着满足特定查找算法的数据结构&#xff0c;这些数据结构以某种方式引用&#xff08;指向&#xff09;数据&#xff0c; 这…

这是我见过最棒的大模型干货!!!

大模型技术的发展和迭代2024年已经可以按天来计算了&#xff0c;几乎每天都有新的大模型和技术登场。 从基座模型Mamba2&#xff0c;Jamaba&#xff0c;到Dora&#xff0c;LoftQ&#xff0c;GaLore等最新的微调技术&#xff1b;KTO&#xff0c;IPO&#xff0c;SimPO等微调技术…

STM32实战篇:按键(外部输入信号)触发中断

功能要求 将两个按键分别与引脚PA0、PA1相连接&#xff0c;通过按键按下&#xff0c;能够触发中断响应程序&#xff08;不需明确功能&#xff09;。 代码流程如下&#xff1a; 实现代码 #include "stm32f10x.h" // Device headerint main() {//开…

ZGC的流程图

GC标记过程 1、初始标记 扫描所有线程栈的根节点&#xff0c;然后再扫描根节点直接引用的对象并进行标记。这个阶段需要停顿所有的应用线程&#xff08;STW&#xff09;&#xff0c;但由于只扫描根对象直接引用的对象&#xff0c;所以停顿时间很短。停顿时间高度依赖根节点的数…

鸿蒙HarmonyOS应用开发为何选择ArkTS不是Java?

前言 随着智能设备的快速发展&#xff0c;操作系统的需求也变得越来越多样化。为了满足不同设备的需求&#xff0c;华为推出了鸿蒙HarmonyOS。 与传统的操作系统不同&#xff0c;HarmonyOS采用了一种新的开发语言——ArkTS。 但是&#xff0c;刚推出鸿蒙系统的时候&#xff0…

uni-app 保存号码到通讯录

1、 添加模块 2、添加权限 3、添加策略 Android&#xff1a; "permissionExternalStorage" : {"request" : "none","prompt" : "应用保存运行状态等信息&#xff0c;需要获取读写手机存储&#xff08;系统提示为访问设备上的照片…

Prometheus + alermanager + webhook-dingtalk 告警

添加钉钉机器人 1. 部署 alermanager 1.1 下载软件包 wget https://github.com/prometheus/alertmanager/releases/download/v0.26.0/alertmanager-0.26.0.linux-amd64.tar.gz 网址 &#xff1a;Releases prometheus/alertmanager (github.com) 1.2 解压软件包 mkdir -pv …

用 Kotlin 编写四则运算计算器:从零开始的简单教程

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌…

电-气阀门定位器YT-1000系列产品说明

电-气阀门定位器YT-1000系列 使用注意事项 • 搬运安装或使用中对产品过大的震动或撞击会成为产品故障的原因。 • 超过规定参数范围使用也会成为产品故陷的原因。 • 不使用的气路接口要用堵塞堵住。 • 不使用产品而长时间放悝在室外时,要盖上产品外壳以免雨水进入产品…

八款主流电脑监控软件推荐|2024年最佳电脑监控软件排行榜

在现代社会中&#xff0c;电脑监控软件已经成为企业和家庭不可或缺的工具。无论是为了确保员工的工作效率&#xff0c;还是保护孩子在互联网上的安全&#xff0c;这些软件都能提供有力的支持。本文将为大家介绍2024年最受欢迎的八款电脑监控软件。 1. 固信软件 固信软件是一款综…

服务重启时容器未自动启动

1、容器重启策略 通过设置容器的重启策略&#xff0c;‌可以决定在容器退出时Docker守护进程是否重启该容器。‌常见的重启策略包括&#xff1a;‌ no&#xff1a;‌不重启容器&#xff0c;‌默认策略。‌always&#xff1a;‌无论容器是如何退出的&#xff0c;‌总是重启容器…