427. 建立四叉树

https://leetcode.cn/problems/construct-quad-tree/description/?envType=study-plan-v2&envId=top-interview-150

思路:这题乍一看很复杂但是只要读懂题找到规律就会发现其实很简单
四叉树的构造规律:
1. 如果一个区域的值全相等,那么这个区域就是叶子节点,val = grid[x][y]==1, isLeaf = true。
2. 如果一个区域的值不全相等,那么这个区域就不是叶子节点,val = 随意(true、false都行), isLeaf = false。
3. 如果一个区域的值不全相等,那么这个新生成的节点不是叶节点所以有四个子节点,每个子节点对应一个子区域;反之叶节点不应该有子节点。

所以我们就可以对grid分治了,每次将它分成四个区域,如果某一区域不能再分了,我们就返回该区域对应节点(一定是leaf),递归结束后我们再按规律合并这四个区域。

class Solution {class Node {public boolean val;public boolean isLeaf;public Node topLeft;public Node topRight;public Node bottomLeft;public Node bottomRight;public Node() {this.val = false;this.isLeaf = false;this.topLeft = null;this.topRight = null;this.bottomLeft = null;this.bottomRight = null;}public Node(boolean val, boolean isLeaf) {this.val = val;this.isLeaf = isLeaf;this.topLeft = null;this.topRight = null;this.bottomLeft = null;this.bottomRight = null;}public Node(boolean val, boolean isLeaf, Node topLeft, Node topRight, Node bottomLeft, Node bottomRight) {this.val = val;this.isLeaf = isLeaf;this.topLeft = topLeft;this.topRight = topRight;this.bottomLeft = bottomLeft;this.bottomRight = bottomRight;}}public Node construct(int[][] grid) {Node root = divide(grid, 0, 0, grid.length - 1, grid[0].length - 1);return root;}public Node divide(int[][] grid, int x1, int y1, int x2, int y2) {if( x1 == x2 && y1 == y2) {return new Node(grid[x1][y1] == 1, true);}// 把这个区域分成四部分int topLeft_x1 = x1, topLeft_y1 = y1, topLeft_x2 = (x1 + x2) / 2, topLeft_y2 = (y1 + y2) / 2;int topRight_x1 = x1, topRight_y1 = topLeft_y2 + 1, topRight_x2 = topLeft_x2, topRight_y2 = y2;int bottomLeft_x1 = topLeft_x2 + 1, bottomLeft_y1 = y1, bottomLeft_x2 = x2, bottomLeft_y2 = topLeft_y2;int bottomRight_x1 = bottomLeft_x1, bottomRight_y1 = topLeft_y2 + 1, bottomRight_x2 = x2, bottomRight_y2 = y2;Node topLeftNode = divide(grid, topLeft_x1, topLeft_y1, topLeft_x2, topLeft_y2);Node topRightNode = divide(grid, topRight_x1, topRight_y1, topRight_x2, topRight_y2);Node bottomLeftNode = divide(grid, bottomLeft_x1, bottomLeft_y1, bottomLeft_x2, bottomLeft_y2);Node bottomRightNode = divide(grid, bottomRight_x1, bottomRight_y1, bottomRight_x2, bottomRight_y2);return merge(topLeftNode, topRightNode, bottomLeftNode, bottomRightNode);}public Node merge(Node topLeft, Node topRight, Node bottomLeft, Node bottomRight) {// 如果所有子节点全是叶子节点并且它们的值全相等就说明新被构造出的节点也是叶子节点// 注意新构造出的叶子节点没有子节点if(topLeft.isLeaf && topRight.isLeaf && bottomLeft.isLeaf && bottomRight.isLeaf&& topLeft.val == topRight.val && topRight.val == bottomLeft.val && bottomLeft.val == bottomRight.val) {return new Node(topLeft.val, true, null, null, null, null);} else { // 否则新构造出的节点不是叶子节点,该节点的值随意return new Node(topLeft.val, false, topLeft, topRight, bottomLeft, bottomRight);}}public static void main(String[] args) {Solution solution = new Solution();int[][] grid = {{1,1,1,1,0,0,0,0},{1,1,1,1,0,0,0,0},{1,1,1,1,1,1,1,1},{1,1,1,1,1,1,1,1},{1,1,1,1,0,0,0,0},{1,1,1,1,0,0,0,0}, {1,1,1,1,0,0,0,0},{1,1,1,1,0,0,0,0}};solution.construct(grid);}
}

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

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

相关文章

IDEA中创建SpringBoot项目没有Java8

IDEA中创建SpringBoot项目没有Java8 文章目录 IDEA中创建SpringBoot项目没有Java8一:解决办法 很久没单独创建springboot项目,今天使用idea的Spring Initializr 创建 Spring Boot项目时,发现java版本里,无法选择jdk1.8,只有17、21、22,所以本文介绍了使用Spring Ini…

聊一聊手动测试与探索性测试的区别

目录 一 定义与目标 手动测试 探索性测试 二 执行方式 手动测试 探索性测试 三 测试重点及计划性 手动测试 探索性测试 四 测试效率及成本 手动测试 探索性测试 五 优缺点对比 六 关键却别与总结 七 适应场景 手动测试 探索性测试 八 实际应用与结合 在我们进…

Spring用到的设计模式

Spring框架中广泛应用了多种设计模式,以提升代码的灵活性和可维护性。 工厂模式:BeanFactory,整个 IoC 容器就是一个工厂。 单例模式:Spring 管理的 Bean 默认都是单例的。 模版方法:如 RedisTemplate、JdbcTemplat…

Mybatis(2)

sql注入攻击 SQL注入攻击是一种常见的网络安全威胁,攻击者通过在输入字段中插入恶意SQL代码,绕过应用程序的安全机制,直接操纵数据库。 SQL注入的原理 SQL注入利用应用程序未对用户输入进行充分过滤或转义的漏洞。当用户输入被直接拼接到S…

【Node.js】高级主题

个人主页:Guiat 归属专栏:node.js 文章目录 1. Node.js 高级主题概览1.1 高级主题架构图 2. 事件循环与异步编程深度解析2.1 事件循环机制详解事件循环阶段详解 2.2 异步编程模式演进高级异步模式实现 3. 内存管理与性能优化3.1 V8 内存管理机制内存监控…

冰箱热交换的原理以及如何加氟

冰箱如何加氟: 氟利昂被节流装置降压后,进入冰箱的蒸发器,此时它处于低温低压液态状态。在冰箱内部(例如 0C 或 -10C):它很容易气化(因为其沸点很低)在气化过程中吸收周围热量。 1…

WordPress多语言插件安装与使用教程

WordPress多语言插件GTranslate的使用方法 在wordpress网站后台搜索多语言插件GTranslate并安装,安装完成、用户插件后开始设置,以下为设置方法: 1、先在后台左侧找到Gtranslate,进入到设置界面 2、选择要显示的形式&#xff0c…

DELL EMC PowerStore BBU更换手册

写在前面 上周给客户卖了一个BBU电池,客户要写一个更换方案。顺利完成了更换,下面就把这个更换方案给大家share出来,以后客户要写,您就Ctrlc 和Ctrlv就可以了。 下面的步骤是最理想的方式,中间没有任何的问题&#xff…

FastMCP:为大语言模型构建强大的上下文和工具服务

FastMCP:为大语言模型构建强大的上下文和工具服务 在人工智能快速发展的今天,大语言模型(LLM)已经成为许多应用的核心。然而,如何让这些模型更好地与外部世界交互,获取实时信息,执行特定任务&a…

CMake基础:CMakeLists.txt 文件结构和语法

目录 1.CMakeLists.txt基本结构 2.核心语法规则 3.关键命令详解 4.常用预定义变量 5.变量和缓存 6.变量作用域与传递 7.注意事项 1.CMakeLists.txt基本结构 CMakeLists.txt 是 CMake 构建系统的核心配置文件,采用命令式语法组织项目结构和编译流程。主要用于…

战略-2.1 -战略分析(PEST/五力模型/成功关键因素)

战略分析路径,先宏观(PEST)、再产业(产品生命周期、五力模型、成功关键因素)、再竞争对手分析、最后企业内部分析。 本文介绍:PEST、产品生命周期、五力模型、成功关键因素、产业内的战略群组 一、宏观环境…

深入理解设计模式:工厂模式、单例模式

深入理解设计模式:工厂模式、单例模式 设计模式是软件开发中解决常见问题的可复用方案。本文将详细介绍两种种重要的创建型设计模式:工厂模式、单例模式,并提供Java实现示例。 一、工厂模式 工厂模式是一种创建对象的设计模式,…

Jenkins 2.426.2配置“构建历史的显示名称,加上包名等信息“

Jenkins 2.426.2配置“构建历史的显示名称,加上包名等信息" 需求:想要在构建历史中展示,本次运行的是哪个版本或哪个包 操作步骤: 1、先安装插件Build Name and Description Setter 2、Set Build Name 3、构建历史处查看展示 插件特性说明 安装依赖:需手动安装 Build …

为何在VMware中清理CentOS虚拟机后,本地磁盘空间未减少的问题解决

文章目录 前言原因:虚拟机磁盘,到底是咋回事?为啥空间没变小? 解决方案 前言 在使用VMware运行CentOS虚拟机时,你是否曾遇到过这样的情况:明明在虚拟机内删除了大量文件,rm -rf 后发现并没什么用&#xff…

Development靶机通关笔记

一、主机发现 arp-scan -l靶机ip为192.168.55.152 二、端口扫描、目录枚举、漏洞扫描、指纹识别 2.1端口扫描 nmap --min-rate 10000 -p- 192.168.55.152发现靶机没有开放80端口,开放的是8080端口 UDP端口扫描 nmap -sU --min-rate 10000 -p- 192.168.55.152靶…

自然语言处理核心技术:词向量(Word Embedding)解析

自然语言处理核心技术:词向量(Word Embedding)全面解析 在自然语言处理(NLP)领域,如何让计算机理解人类语言的语义一直是核心挑战。词向量(Word Vector),又称词嵌入&…

【Matlab】雷达图/蛛网图

文章目录 一、简介二、安装三、示例四、所有参数说明 一、简介 雷达图(Radar Chart)又称蛛网图(Spider Chart)是一种常见的多维数据可视化手段,能够直观地对比多个指标并揭示其整体分布特征。 雷达图以中心点为原点&…

Vue3实现轮播表(表格滚动)

在这之前,写过一篇Vue2实现该效果的博文:vue-seamless-scroll(一个简单的基于vue.js的无缝滚动) 有兴趣也可以去看下,这篇是用vue3实现,其实很简单,目的是方便后面用到直接复制既可以了。 安装: <

安卓开发用到的设计模式(1)创建型模式

安卓开发用到的设计模式&#xff08;1&#xff09;创建型模式 文章目录 安卓开发用到的设计模式&#xff08;1&#xff09;创建型模式1. 单例模式&#xff08;Singleton Pattern&#xff09;2. 工厂模式&#xff08;Factory Pattern&#xff09;3. 抽象工厂模式&#xff08;Abs…

后端开发概念

1. 后端开发概念解析 1.1. 什么是服务器&#xff0c;后端服务 1.1.1. 服务器 服务器是一种提供服务的计算机系统&#xff0c;它可以接收、处理和响应来自其他计算机系统&#xff08;客户端&#xff09;的请求。服务器主要用于存储、处理和传输数据&#xff0c;以便客户端可以…