337.打家劫舍III

2023-09-18 21:04:53

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

提示:

  • 树的节点数在 [1, 104] 范围内
  • 0 <= Node.val <= 104

核心思想:深度搜索,判断每个节点的状态(从最下面开始判断结点状态),然后根据不同的状态进行不同的操作,要是被选中了,那么左右子树不能被选中;如果没有被选中,就是找左右子树中最大的一个进行返回

void fun(struct TreeNode*root,int *yes,int *no){
     int Lyes = 0, Lno = 0;//分别表示左边子树选中、左边子树未选中
     int Ryes = 0, Rno = 0;//与上同理
     if(root->left != NULL){
         //递归左子树
         fun(root->left,&Lyes,&Lno);
     }
     if(root->right != NULL){
         fun(root->right,&Ryes,&Rno);
     }
     //如果当前结点被选上了,那么就是返回左右没选上的节点的最大值加上该节点的值
     *yes = Lno + Rno + root->val;
     //如果当前结点没有别选上,那就从左右子树中找到更大的一颗子树
     *no = max(Lyes,Lno) + max(Ryes,Rno);
 }

参数是树,左边子树最大的值,右边子树最大值

首先定义四个变量分别表示左结点选中与未被选中,右节点别选中和未被选中

然后递归左子树一直到倒数第二层的左节点,然后有一棵高度为2的子树,然后判断是选中这个结点,那么就更新这个结点的值为未被选中的时候的左子树和右子树和该结点的和;如果没有选中这个结点,那么就找出左子树右子树中的最大的一个数值,更新到这个结点;右边也是同理

int rob(struct TreeNode* root){
    void fun();
    int max();

    int yes = 0;
    int no = 0;
    if(root != NULL){
        fun(root,&yes,&no);
    }
    //比较顶点结点选中与不选中的大小,返回更大的值
    return max(yes,no);

}

这个函数中就是找出以根节点为目标节点,找出最大值

完整代码

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */


int rob(struct TreeNode* root){
    void fun();
    int max();

    int yes = 0;
    int no = 0;
    if(root != NULL){
        fun(root,&yes,&no);
    }
    //比较顶点结点选中与不选中的大小,返回更大的值
    return max(yes,no);

}

 void fun(struct TreeNode*root,int *yes,int *no){
     int Lyes = 0, Lno = 0;//分别表示左边子树选中、左边子树未选中
     int Ryes = 0, Rno = 0;//与上同理
     if(root->left != NULL){
         //递归左子树
         fun(root->left,&Lyes,&Lno);
     }
     if(root->right != NULL){
         fun(root->right,&Ryes,&Rno);
     }
     //如果当前结点被选上了,那么就是返回左右没选上的节点的最大值加上该节点的值
     *yes = Lno + Rno + root->val;
     //如果当前结点没有别选上,那就从左右子树中找到更大的一颗子树
     *no = max(Lyes,Lno) + max(Ryes,Rno);
 }

 int max(int x,int y){
     return x>=y?x:y;
 }

更多推荐

大模型股票交易-挖掘新闻和情绪价值

埃隆·马斯克(ElonMusk)的星际飞船于2023年4月20日升空后爆炸。想象一下,当时您正在观察股市,突然出现新闻,您会如何交易TSLA股票?我希望您不要与我争论,您作为交易者(而不是投资者)要做的第一件事就是摆脱现有的多头头寸并可能做空股票。让我们看看这样的交易是否有利可图。根据此链接SpaceXrocketla

飞驰的高铁-第15届蓝桥杯第一次STEMA测评Scratch真题精选

[导读]:超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成,后续会不定期解读蓝桥杯真题,这是Scratch蓝桥杯真题解析第150讲。飞驰的高铁,本题是2023年8月20日举行的第15届蓝桥杯STEMA测评Scratch编程中级组编程第2题,题目要求编程实现模拟高铁飞驰前进的效果。当按下数字1时,画面中的景

游戏创业小知识:游戏运营的步骤和流程

游戏运营是确保游戏在持续运行中保持活跃和成功的过程。以下是游戏运营的一般步骤流程:1.游戏发布前准备游戏选择:了解并熟悉游戏的核心概念、目标受众和游戏玩法。开发团队:组建开发团队,包括程序员、设计师、艺术家和声音设计师等。技术基础设施:建立游戏服务器、数据库和其他必要的技术基础设施。资金筹集:获取足够的资金来支持游戏的

原生微信小程序中进行 API 请求

原生微信小程序中进行API请求当在原生微信小程序中进行API请求时,封装请求可以提高代码的可维护性和可扩展性。在本篇博客中,我们将一步步介绍如何进一步封装请求,并添加请求超时、拦截器和请求取消功能。第一步:基本请求封装首先,我们创建一个用于发送HTTP请求的基本封装。在微信小程序中,我们使用wx.request发送请求

day41 jdk8新特性Stream流 数据库安装

流(Stream)中保存了对集合或者数组数据的操作,和集合类似,但是集合中保存的是数据。Stream不能保存数据一、创建流通过Collection对象的stream()或者parallelStream()通过Arrays类的stream(Array[]<T>)方法通过Stream接口of()iterate()gener

Java版本spring cloud + spring boot企业电子招投标系统源代码

项目说明随着公司的快速发展,企业人员和经营规模不断壮大,公司对内部招采管理的提升提出了更高的要求。在企业里建立一个公平、公开、公正的采购环境,最大限度控制采购成本至关重要。符合国家电子招投标法律法规及相关规范,以及审计监督要求;通过电子化平台提高招投标工作的公开性和透明性;通过电子化招投标,使得招标采购的质量更高、速度

计算机视觉与深度学习-经典网络解析-ZFNet-[北邮鲁鹏]

这里写目录标题ZFNet主要改进减小第一层卷积核将第二、第三个卷积层的卷积步长都设置为2增加了第三、第四个卷积层的卷积核个数ZFNetZFNet是一种基于AlexNet的模型,由MatthewD.Zeiler和RobFergus在2013年提出。相对于AlexNet,ZFNet结构与AlexNet网络结构基本一致,进行

阿里云服务器ECS_云主机_服务器托管_计算性能介绍

阿里云服务器是什么?云服务器ECS是一种安全可靠、弹性可伸缩的云计算服务,云服务器可以降低IT成本提升运维效率,免去企业或个人前期采购IT硬件的成本,阿里云服务器让用户像使用水、电、天然气等公共资源一样便捷、高效地使用服务器。阿里云服务器具有安全、稳定、弹性升降配、高性能、易用可扩展等优势。阿里云百科来详细说下什么是阿

使用 rtty 进行远程 Linux 维护和调试

rtty是一个用于在终端上进行远程连接和数据传输的工具。它提供了一种简单的方式来与远程设备进行通信,使得在不同主机之间传输数据变得更加方便。安装rtty是一个可执行程序,可以在Linux、macOS和Windows等平台上使用。Linux/macOS在终端中执行以下命令,使用curl下载rtty可执行文件:curl-L

Golang代码漏洞扫描工具介绍——trivy

Golang代码漏洞扫描工具介绍——trivyGolang作为一款近年来最火热的服务端语言之一,深受广大程序员的喜爱,笔者最近也在用,特别是高并发的场景下,golang易用性的优势十分明显,但笔者这次想要介绍的并不是golang本身,而且golang代码的漏洞扫描工具,毕竟作为服务端的程序,安全性一直是一个不同忽视的地

新势力在智能化路上,正抢了Tier 1的生意

作者|&nbsp;Amy编辑|&nbsp;德新上半年的汽车行业价格内卷,下半年则一下资本涌入,风起云涌。先是蔚来拿到了11亿美元来自中东的投资,紧接着7月大众以7亿美元投资小鹏汽车,8月哪吒完成70亿元Crossover轮投资。传闻中,还有大众捷达与Stelliantis两大集团接洽零跑汽车,秘密洽谈投资收购以及潜在的

热文推荐