图解LeetCode——1145. 二叉树着色游戏(难道:中等)

news2024/12/23 4:36:43

一、题目

有两位极客玩家参与了一场「二叉树着色」的游戏。游戏中,给出二叉树的根节点 root,树上总共有 n 个节点,且 n 为奇数,其中每个节点上的值从 1 到 n 各不相同。 最开始时:

  • 「一号」玩家从 [1, n] 中取一个值 x1 <= x <= n);
  • 「二号」玩家也从 [1, n] 中取一个值 y1 <= y <= n)且 y != x

「一号」玩家给值为 x 的节点染上红色,而「二号」玩家给值为 y 的节点染上蓝色。 之后两位玩家轮流进行操作,「一号」玩家先手。每一回合,玩家选择一个被他染过色的节点,将所选节点一个 未着色 的邻节点(即左右子节点、或父节点)进行染色(「一号」玩家染红色,「二号」玩家染蓝色)。 如果(且仅在此种情况下)当前玩家无法找到这样的节点来染色时,其回合就会被跳过。 若两个玩家都没有可以染色的节点时,游戏结束。着色节点最多的那位玩家获得胜利 ✌️。 现在,假设你是「二号」玩家,根据所给出的输入,假如存在一个 y 值可以确保你赢得这场游戏,则返回 true ;若无法获胜,就请返回 false 。

二、示例

示例 1 :

【输入】:root = [1,2,3,4,5,6,7,8,9,10,11], n = 11, x = 3
【输出】:true
【解释】:第二个玩家可以选择值为 2 的节点。

示例 2 :

【输入】root = [1,2,3], n = 3, x = 1
【输出】false

提示:

  • 树中节点数目为 n
  • 1 <= x <= n <= 100
  • n 是奇数
  • 1 <= Node.val <= n
  • 树中所有值 互不相同

三、解题思路

根据题目描述,我们其实可以知道一号玩家是先手的,那么他第一次落子的位置,就决定着我们作为二号选手是否有机会能赢得比赛。我们以下图中的节点为例,假设一号选手选择了节点2这个位置落下了第一个棋子,那么如果二号选手选择了节点3,那么我们就可以将整个树节点划分为如下3个区域,如下图所示:

区域1】公共待抢占区域:Node(1)
区域2】一号玩家私有区域:Node(2)Node(4)Node(5)
区域3】二号玩家私有区域:Node(3)Node(6)Node(7)

那么,我们对上面的逻辑清晰了之后,其实就可以得出一个解题思路,就是我们只需要根据一号选手第1次落子(firstNode)的位置来计算3种情况,即:

情况1】二号选手落子在firstNode的左子节点上时,二号选手私有区域是否大于总数的一半。
情况2】二号选手落子在firstNode的右子节点上时,二号选手私有区域是否大于总数的一半。
情况3】二号选手落子在firstNode的根节点节点上时,二号选手私有区域是否大于总数的一半。

如果满足上面的3个情况任意一种,则二号选手就有获胜的可能了。那么,问题来了,_为啥只关注了私有区域却没有关注公有区域呢?_原因就是,因为一号选手是先手的,他本来就在落子顺序上占据了先机,那么对于占用公有区域的操作来说,一号选手也是具有先手的优势的。所以,对于二号选手的获胜条件只能是,自己的私有区域要足够的大。

解题思路说完了,下面我们就以例子来看一下,具体逻辑如下图所示:

四、代码实现

class Solution {
    int ltnc = 0, rtnc = 0;
    public boolean btreeGameWinningMove(TreeNode root, int n, int x) {
        nodeCount(root, x);
        return 2*ltnc > n || 2*rtnc > n || 2*(ltnc + rtnc + 1) < n;
    }
    public int nodeCount(TreeNode t, int v) {
        if (t == null) return 0;
        int lc = nodeCount(t.left, v);
        int rc = nodeCount(t.right, v);
        if (t.val == v) { // 找到x选择的node,开始记录这个node的左子树和右子树的节点个数
            ltnc = lc;
            rtnc = rc;
        }
        return lc + rc + 1;
    }
}

今天的文章内容就这些了:

写作不易,笔者几个小时甚至数天完成的一篇文章,只愿换来您几秒钟的 点赞 & 分享 。

更多技术干货,欢迎大家关注公众号“爪哇缪斯” ~ \(^o^)/ ~ 「干货分享,每天更新」

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

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

相关文章

Ubuntu22.04安装nvidia显卡驱动

Ubuntu22.04安装nvidia显卡驱动 目录 方法一&#xff1a;使用官方的NVIDIA驱动进行手动安装&#xff08;稳定、靠谱&#xff09; 方法二&#xff1a;使用系统自带的“软件和更新”程序-附加驱动更新&#xff08;需要联网&#xff0c;稳定性无法验证&#xff09; 浓缩极简方法…

MySQL入门篇-视图简介

备注:测试数据库版本为MySQL 8.0 这个blog我们来聊聊MySQL视图。 前言: 视图是从一个或几个基本表导出的表。视图本身不独立存储在数据库中&#xff0c;是一个虚表。 即数据库中只存放视图的定义而不存放视图对应的数据&#xff0c;这些数据仍存放在导出视图的基本表中。 视…

[Windows] 微信超级管家,自动好友回复、计数、自动同意、群发、好友导出、消息日志、无限多开

简介 微信超级管家是一款大神针对微信制作的工具&#xff0c;它的主要功能包括了自动回复、好友计数、自动同意、群发、好友导出、消息日志、无限多开等等&#xff0c;让你拥有无限潜力哈&#xff0c;经常使用微信电脑版的朋友一定会用的上。 下载 微信超级管家 软件功能 1…

安全测试之浅析静态应用

SAST&#xff0c;Static Application Security Testing&#xff0c;即静态应用安全测试&#xff0c;也叫静态分析&#xff0c;是一种测试方法&#xff0c;一直是应用程序安全性工作的核心部分。根据Forrester的 The State Of Application Security, 2022一文的预测&#xff0c;…

云计算|OpenStack|社区版OpenStack安装部署文档(七--- 仪表盘服务dashboard的安装部署---Rocky版)

前言&#xff1a; 仪表盘是一般项目的标配&#xff0c;有了仪表盘可以降低运维工作&#xff0c;并且很多的管理工作是可以可视化的。本节计划在控制节点安装openstack官网的仪表盘项目 openstack由于是一个开源的社区版本云计算项目&#xff0c;因此&#xff0c;它的web仪表盘…

【Core】.net core 3.1 api 返回实体类数据存在null,导致小程序调用接口也直接显示了null,原来要这样设置才可

对接过API接口的小伙伴都知道&#xff0c;接口返回的Json格式数据&#xff0c;有些字段可能会出现null的情况&#xff0c;并且还是个字符串&#xff0c;直接显示在用户界面上给人感觉出bug了 文章目录【开发环境】【场景描述】【返回null值重现】1&#xff09;创建新项目2&…

细讲TCP三次握手四次挥手(二)

TCP/IP 协议族 应用层 应用层( application-layer &#xff09;的任务是通过应用进程间的交互来完成特定网络应用。应用层协议定义的是应用进程&#xff08;进程&#xff1a;主机中正在运行的程序&#xff09;间的通信和交互的规则。 对于不同的网络应用需要不同的应用层协议…

基本放大器电路- (一)

运算放大器组成的电路五花八门&#xff0c;令人眼花瞭乱&#xff0c;是模拟电路中学习的重点。在分析它的工作原理时倘没有抓住核心&#xff0c;往往令人头大。为此本人特搜罗天下运放电路之应用&#xff0c;来个“庖丁解牛”&#xff0c;希望各位从事电路板维修的同行&#xf…

精讲rpc框架,这么讲不怕你不明白!

谈到rpc框架可能有点陌生感&#xff0c;但是如果换成框架语言Ocaml&#xff0c;大家一定不陌生。 众所周知&#xff0c;ocaml是一款专门做functional programming的一款软件&#xff0c;尤其是它的界面非常简洁&#xff0c;还是专门的server进行线上编写。 rpc框架和ocaml是什…

一篇就看懂的文件操作

文件操作1为什么使用文件我们前面学习结构体时&#xff0c;写了通讯录的程序&#xff0c;当通讯录运行起来的时候&#xff0c;可以给通讯录中增加、删除数据&#xff0c;此时数据是存放在内存中&#xff0c;当程序退出的时候&#xff0c;通讯录中的数据自然就不存在了&#xff…

【Java并发编程】 interrupt 方法详解

【Java并发编程】 interrupt 方法详解 文章目录【Java并发编程】 interrupt 方法详解1.介绍2.打断阻塞状态线程3.打断正常状态的线程4.两阶段终止模式5.打断 park 线程1.介绍 程序中&#xff0c;有些线程的终端需要外部干预&#xff0c;比如有线程存在while(true)循环&#xf…

值得拥有并收藏的 3个安卓/鸿蒙手机解锁软件

手机无论支持哪种操作系统&#xff0c;都占据了每个人口袋里的空间。随着大量移动设备的使用&#xff0c;搜索引擎上也出现了同样数量的查询&#xff0c;其中最常见的是提供安卓/鸿蒙屏幕锁定删除工具。由于安卓是当今最畅销的设备&#xff0c;我们的首要任务是为您提供最好的安…

矿山安全生产监测预警系统 opencv

矿山安全生产监测预警系统通过pythonopencv网络模型计算机视觉技术&#xff0c;对现场画面中人的不安全行为”、“物的不安全状态”、“环境的不安全因素”三方面出发进行实时监测&#xff0c;当监测到现场画面中人员未穿反光衣行为、明火烟雾、未穿安全帽行为、矿车掉道识别、…

【王道数据结构】第三章 | 栈和队列

目录 一、栈stack 基本概念 基本操作 存储结构​​​​​​​ 二、队列Queue 基本概念 队列的基本操作 存储结构 三、栈的应用 栈在括号匹配中的应用 栈在表达式求值中的应用​编辑 栈在递归中的应用 一、栈stack 基本概念 只允许在一端(栈顶top)进行插入或删除操…

大数据看全国疫情生活,北京、武汉已过疫情拐点

自2022年11月末&#xff0c;很多地区新冠病例数据呈现下降趋势&#xff0c;与实际感知有明显差异。2022年12月14日&#xff0c;国家疾控中心发布消息&#xff0c;核酸检测实行“愿检尽检”&#xff0c;不再公布无症状感染者数据。因此&#xff0c;网友们想要了解所在地和老家的…

python能做的100件事04 - python解析PDF

1. python常用pdf库 名称特点PyPDF2已不再维护&#xff0c;继任者PyPDF4 ,但很长时间没有更新了,能读不能写pdfrw能读不能写&#xff0c;但可以兼容ReportLab写ReportLab商业版的开源版本&#xff0c;能写不能读pikepdf能读不能写pdfplumber能读不能写PyMuPDF读写均可,基于GPL…

Vue面试题2

1&#xff1a;vue.js的两个核心是什么&#xff1f; 答:数据驱动和组件化。 2&#xff1a;vue生命周期钩子函数有哪些&#xff1f; 答:总共分为8个阶段创建前/后&#xff0c;载入前/后&#xff0c;更新前/后&#xff0c;销毁前/后 3&#xff1a;第一次页面加载会触发哪几个钩子…

C语言二维数组中:主次对角线求和,上下三角求和,杨辉三角,矩阵转置

p8 有些的结论需要直接记住 目录 矩阵转置 主对角线和次对角线 下三角 和上三角&#xff08;一般是让求和&#xff09; 下三角 上三角 杨辉三角 矩阵转置 不是方阵 需要用到第二个二维数组 b[i][j]a[i][j] 是方阵 方法1 借助第二个二维数组&#xff0c;同上 方…

C++基础-3函数

一、函数 1.概述 作用&#xff1a;将一段经常使用的代码封装起来&#xff0c;减少重复代码 而一个较大的程序&#xff0c;一般分为若干个代码块&#xff0c;每个模块实现特定的功能 2.定义 5个内容&#xff1a; ①返回值类型 ②函数名 ③参数列表 ④函…

力扣刷题记录——1287. 有序数组中出现次数超过25%的元素、1299. 将每个元素替换为右侧最大元素 、1413. 逐步求和得到正数的最小值

本专栏主要记录力扣的刷题记录&#xff0c;备战蓝桥杯&#xff0c;供复盘和优化算法使用&#xff0c;也希望给大家带来帮助&#xff0c;博主是算法小白&#xff0c;希望各位大佬不要见笑&#xff0c;今天要分享的是——《力扣刷题记录——1287. 有序数组中出现次数超过25%的元素…