打家劫舍3

今天和打家讲一下打家劫舍3

题目:

题目链接:337. 打家劫舍 III - 力扣(LeetCode)

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

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

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

示例 1:

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

示例 2:

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

代码: 

class Solution {
    #define x first
    #define y second 
    typedef pair<int,int> PII;
public:
    int rob(TreeNode* root) {
        if(!root) return 0;
        auto t =dfs(root);
        int ans=max(t.x,t.y);
        return ans;
    }

  inline  PII dfs(TreeNode* u){//pair<tou,butou>
        if(!u) return {0,0};
        int stolen=u->val;
        PII l = dfs(u->left);
        PII r = dfs(u->right);
        stolen +=l.y+r.y ;
        int nostolen=0;
        if (l.x>l.y)  nostolen=l.x;
        else nostolen =l.y;

        if (r.x>r.y)  nostolen +=r.x;
        else nostolen +=r.y;
        
        PII t={stolen , nostolen};
        return t;
    }
};

运行效率:

 

 宏定义与类型别名:

#define x first    // 用 x 表示 pair 的 first(偷当前节点的最大值)
#define y second   // 用 y 表示 pair 的 second(不偷当前节点的最大值)
typedef pair<int, int> PII;

PII 是一个二元组,存储两个状态:

first(x):偷当前节点时的最大收益。
second(y):不偷当前节点时的最大收益。

主函数 rob:

若树为空,直接返回0。

调用dfs递归计算根节点的两种状态,返回较大值。

int rob(TreeNode* root) {
    if (!root) return 0;
    auto t = dfs(root);
    return max(t.x, t.y); // 最终结果取根节点偷或不偷的最大值
}

递归函数 dfs:

PII dfs(TreeNode* u) {
    if (!u) return {0, 0}; // 空节点返回 {0,0}
    int stolen = u->val;   // 偷当前节点
    PII l = dfs(u->left);  // 递归左子树
    PII r = dfs(u->right); // 递归右子树
    stolen += l.y + r.y;   // 偷当前节点时,左右子节点必须不偷
    // 不偷当前节点时,左右子节点可偷或不偷(取各自最大值相加)
    int nostolen = max(l.x, l.y) + max(r.x, r.y); 
    return {stolen, nostolen}; // 返回当前节点的两种状态
}
  • 偷当前节点(stolen):
    当前节点的值 + 左子节点不偷的最大值(l.y) + 右子节点不偷的最大值(r.y)。

  • 不偷当前节点(nostolen):
    左子节点偷或不偷的最大值(max(l.x, l.y)) + 右子节点偷或不偷的最大值(max(r.x, r.y))。


动态规划逻辑:

状态定义:

代码通过后序遍历 + 动态规划实现,每个节点返回两个状态:

  • stolen(偷当前节点的最大收益)
  • not_stolen(不偷当前节点的最大收益)
    最终取根节点的两种状态的最大值。

对每个节点 u,定义两个状态:

stolen(偷 u 时的最大收益)。

nostolen(不偷 u 时的最大收益)。

状态转移:

偷当前节点
不能偷子节点,因此收益为:

stolen=u.val+left.y+right.ystolen=u.val+left.y+right.y

不偷当前节点
子节点可自由选择偷或不偷,取最大值相加:

nostolen=max⁡(left.x,left.y)+max⁡(right.x,right.y)nostolen=max(left.x,left.y)+max(right.x,right.y)

递归过程:

  • 从叶子节点向上递推,确保每个节点的状态仅依赖子节点的状态。


示例分析:

假设二叉树如下:

     3
    / \
   2   3
    \   \ 
     3   1

叶子节点(值为3和1的节点):

  • stolen = 3(或1),nostolen = 0(不偷叶子节点时无收益)。

中间节点(值为2的节点):

  • 偷:2 + 0(左子不偷) + 0(右子不偷) = 2。
  • 不偷:max(0, 3)(左子偷或不偷的最大值) + 0 = 3。

根节点(值为3):

  • 偷:3 + 3(左子不偷) + 1(右子不偷) = 7。
  • 不偷:max(2, 3)(左子状态) + max(3, 1)(右子状态) = 3 + 3 = 6。

最终结果:max(7, 6) = 7。

关键点:

  • 确保子节点状态传递正确,尤其是“不偷当前节点”时,子节点可自由选择偷或不偷。

  • 后序遍历确保先处理子节点再处理父节点。

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

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

相关文章

redis项目

短信登录 这一块我们会使用redis共享session来实现 商户查询缓存 通过本章节&#xff0c;我们会理解缓存击穿&#xff0c;缓存穿透&#xff0c;缓存雪崩等问题&#xff0c;让小伙伴的对于这些概念的理解不仅仅是停留在概念上&#xff0c;更是能在代码中看到对应的内容 优惠…

每日一题洛谷P5733 【深基6.例1】自动修正c++

#include<iostream> #include<string> using namespace std; int main() {string t;cin >> t;for (int i 0; i < t.length(); i){if (t[i] > a && t[i] < z){t[i] A - a;}cout << t[i];}return 0; }

windows + visual studio 2019 使用cmake 编译构建静、动态库并调用详解

环境 windows visual studio 2019 visual studio 2019创建cmake工程 1. 静态库.lib 1.1 静态库编译生成 以下是我创建的cmake工程文件结构&#xff0c;只关注高亮文件夹部分 libout 存放编译生成的.lib文件libsrc 存放编译用的源代码和头文件CMakeLists.txt 此次编译CMak…

【含文档+PPT+源码】基于微信小程序的校园志愿者管理系统的设计与实现

项目介绍 本课程演示的是一款 基于微信小程序的校园志愿者管理系统的设计与实现&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 1.包含&#xff1a;项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署运行本…

SOME/IP--协议英文原文讲解5

前言 SOME/IP协议越来越多的用于汽车电子行业中&#xff0c;关于协议详细完全的中文资料却没有&#xff0c;所以我将结合工作经验并对照英文原版协议做一系列的文章。基本分三大块&#xff1a; 1. SOME/IP协议讲解 2. SOME/IP-SD协议讲解 3. python/C举例调试讲解 这一章节…

Linux之Http协议分析以及cookie和session

Linux之Http协议分析以及cookie和session 一.分析请求行与响应行1.1请求行1.1.1资源的URL路径1.1.2常见的方法1.2响应行 二.cookie和session2.1cookie2.2session 一.分析请求行与响应行 在我们简单了解了请求和响应的格式以及模拟实现了请求和响应后我们已经可以通过网页来访问…

vue+element-ui简洁完美实现ju动漫网站

目录 一、项目介绍 二、项目截图 1.项目结构图 2.首页 3.日漫 4.更多>排行榜 5.详情页 6.简单登陆页 三、源码实现 1.路由配置 2.首页 四、总结 一、项目介绍 本项目在线预览&#xff1a;点击访问 本项目为vue项目&#xff0c;以动漫为主题来设计元素&#xff…

协议-WebRTC-HLS

是什么&#xff1f; WebRTC&#xff08;Web Real-Time Communication&#xff09; 实现 Web 浏览器和移动应用程序之间通过互联网直接进行实时通信。允许点对点音频、视频和数据共享&#xff0c;而无需任何插件或其他软件。WebRTC 广泛用于构建视频会议、语音通话、直播、在线游…

本地部署DeepSeek-R1模型(新手保姆教程)

背景 最近deepseek太火了&#xff0c;无数的媒体都在报道&#xff0c;很多人争相着想本地部署试验一下。本文就简单教学一下&#xff0c;怎么本地部署。 首先大家要知道&#xff0c;使用deepseek有三种方式&#xff1a; 1.网页端或者是手机app直接使用 2.使用代码调用API …

有关网络安全的案例分享 如何保障网络安全

网络发展是非常迅速的&#xff0c;互联网在给人们带来生活娱乐便利的同时&#xff0c;也带来了一些安全隐患&#xff0c;这就需要大家做好防骗规范&#xff0c;确保网络安全&#xff0c;51CTO学堂为大家分享下有关网络安全的案例&#xff0c;以供各位参考。 非法获取公民个人信…

2025新鲜出炉--前端面试题(一)

文章目录 1. vue3有用过吗, 和vue2之间有哪些区别2. vue-router有几种路由, 分别怎么实现3. webpack和rollup这两个什么区别, 你会怎么选择4. 你能简单介绍一下webpack项目的构建流程吗5. webpack平时有手写过loader和plugin吗6. webpack这块你平时做过哪些优化吗&#xff1f;7…

变化检测论文阅读合集

1. ChangeCLIP: Remote sensing change detection with multimodal vision-language representation learning 作者&#xff1a;Sijun Dong a, Libo Wang b, Bo Du c, Xiaoliang Meng a,* 年份&#xff1a;2024 研究方法/模型&#xff1a; 重构原始CLIP&#xff1a;提取双时…

viem库

viem是一个用于和以太坊进行交互的javascript库&#xff0c;它提供了简单的API进行智能合约的读取和写入操作&#xff0c;你可以使用它来与区块链上智能合约进行交互&#xff0c;查询链上数据等。 基本功能 1&#xff0c;创建公有客户端 createPublicClient 可以创建一个链接…

2025影视泛目录站群程序设计_源码二次开发新版本无缓存刷新不变实现原理

1. 引言 本设站群程序计书旨在详细阐述苹果CMS泛目录的创新设计与实现&#xff0c;介绍无缓存刷新技术、数据统一化、局部URL控制及性能优化等核心功能&#xff0c;以提升网站访问速度和用户体验。 2. 技术概述 2.1 无缓存刷新技术 功能特点&#xff1a; 内容不变性&#x…

OpenEuler学习笔记(二十三):在OpenEuler上部署开源MES系统

在OpenEuler上部署小企业开源MES&#xff08;制造执行系统&#xff0c;Manufacturing Execution System&#xff09;是一个非常有价值的项目&#xff0c;可以帮助企业实现生产过程的数字化管理。以下是基于开源MES系统&#xff08;如 Odoo MES 或 OpenMES&#xff09;的部署步骤…

大数据项目2:基于hadoop的电影推荐和分析系统设计和实现

前言 大数据项目源码资料说明&#xff1a; 大数据项目资料来自我多年工作中的开发积累与沉淀。 我分享的每个项目都有完整代码、数据、文档、效果图、部署文档及讲解视频。 可用于毕设、课设、学习、工作或者二次开发等&#xff0c;极大提升效率&#xff01; 1、项目目标 本…

c++ haru生成pdf输出饼图

#define PI 3.14159265358979323846 // 绘制饼图的函数 void draw_pie_chart(HPDF_Doc pdf, HPDF_Page page, float *data, int data_count, float x, float y, float radius) { float total 0; int i; // 计算数据总和 for (i 0; i < data_count; i) { tot…

STM32 Unix时间戳

Unix时间戳 Unix 时间戳&#xff08;Unix Timestamp&#xff09;定义为从UTC/GMT的1970年1月1日0时0分0秒开始所经过的秒数&#xff0c;不考虑闰秒 时间戳存储在一个秒计数器中&#xff0c;秒计数器为32位/64位的整型变量 世界上所有时区的秒计数器相同&#xff0c;不同时区通过…

Spring Boot启动内嵌tocmat原理

要研究Spring Boot启动内嵌tomcat的原理&#xff0c;就需要先了解一下Spring Boot自动配置的过程&#xff0c;首先简要的梳理一下springboot自动配置的步骤。 一、SpringBoot自动配置 当SpringBoot应用启动时&#xff0c;EnableAutoConfiguration注解被激活&#xff0c;该注解…

腾讯云AI代码助手评测:如何智能高效完成Go语言Web项目开发

腾讯云AI代码助手评测&#xff1a;如何智能高效完成Go语言Web项目开发 ?? 文章目录 腾讯云AI代码助手评测&#xff1a;如何智能高效完成Go语言Web项目开发 ?? 背景引言开发环境介绍腾讯云AI代码助手使用实例 1. 代码补全2. 技术对话3. 代码优化4. 规范代码5. Bug处理 获得…