这是悦乐书的第224次更新,第237篇原创

01 看题和准备

今天介绍的是LeetCode算法题中Easy级别的第91题(顺位题号是427)。我们想使用四叉树来存储N×N布尔网格。网格中的每个单元格只能是true或false。根节点表示整个网格。对于每个节点,它将被细分为四个子节点,直到它所代表的区域中的值都相同。

每个节点都有另外两个布尔属性:isLeaf和val。当且仅当节点是叶节点时,isLeaf才为真。叶节点的val属性包含它所代表的区域的值。您的任务是使用四叉树来表示给定的网格。例如:

给定下面的8 x 8网格,我们想构建相应的四叉树:



它可以根据上面的定义进行划分:



相应的四叉树应如下,其中每个节点表示为(isLeaf,val)对。

对于非叶节点,val可以是任意的,因此它表示为*。



注意:

  • N小于1000并保证为2的幂。

  • 如果您想了解有关四叉树的更多信息,可以参考其维基。

02 理解题意

题目中所说的叶节点,是指值相同的一片区域,如上图被分成64个小格子的第三张图,左上、左下和右下都表示了一片值相等的区域,左上左下都表示了16个1,右下表示了16个0,而右上中的16个格子,其中有8个0和8个1,只能再进行四等分,才能分别表示四个值相同的区域,所以右上区域不是叶节点,它的isLeaf属性就为false。可以看到最后这张图,根节点不是叶节点,所以其isLeaf也为false,而其他叶节点的isLeaf都为true。

03 第一种解法

题目给的参数是一个二维数组,可以将其想象为一个N×N的格子,其索引就是对应位置的坐标,只要从根节点开始,遇到和根节点值不一样的坐标,就需要进行等分操作,也就是从一个新的N/2×N/2格子开始,再从根节点开始判断。因此可以借助递归的方法,只需要两个从0开始的索引,以及二维数组的长度即可(此参数做再分用)。

/*
// Definition for a QuadTree node.
class Node {
public boolean val;
public boolean isLeaf;
public Node topLeft;
public Node topRight;
public Node bottomLeft;
public Node bottomRight; public Node() {} public Node(boolean _val,boolean _isLeaf,Node _topLeft,Node _topRight,Node _bottomLeft,Node _bottomRight) {
val = _val;
isLeaf = _isLeaf;
topLeft = _topLeft;
topRight = _topRight;
bottomLeft = _bottomLeft;
bottomRight = _bottomRight;
}
};
*/
class Solution {
public Node construct(int[][] grid) {
return build(0, 0, grid.length, grid);
} Node build(int x, int y, int len, int[][] grid){
if (len < 0) {
return null;
}
for (int i = x; i < x+len; ++i) {
for (int j = y; j < y+len; ++j) {
if (grid[i][j] != grid[x][y]) {
return new Node(true, false,
build(x, y, len/2, grid),
build(x, y + len/2, len/2, grid),
build(x + len/2, y, len/2, grid),
build(x + len/2, y + len/2, len/2, grid));
}
}
}
return new Node(grid[x][y] == 1, true, null, null, null, null);
}
}

04 第二种解法

第一种解法是只用两个点来定位区间,此解法利用四个点来定位区间,但是思路都是一样的。

/*
// Definition for a QuadTree node.
class Node {
public boolean val;
public boolean isLeaf;
public Node topLeft;
public Node topRight;
public Node bottomLeft;
public Node bottomRight; public Node() {} public Node(boolean _val,boolean _isLeaf,Node _topLeft,Node _topRight,Node _bottomLeft,Node _bottomRight) {
val = _val;
isLeaf = _isLeaf;
topLeft = _topLeft;
topRight = _topRight;
bottomLeft = _bottomLeft;
bottomRight = _bottomRight;
}
};
*/
class Solution {
public Node construct2(int[][] g) {
return build(0, 0, g.length - 1, g.length - 1, g);
} Node build(int r1, int c1, int r2, int c2, int[][] g) {
if (r1 > r2 || c1 > c2) {
return null;
}
boolean isLeaf = true;
int val = g[r1][c1];
for (int i = r1; i <= r2; i++)
for (int j = c1; j <= c2; j++)
if (g[i][j] != val) {
isLeaf = false;
break;
}
if (isLeaf) {
return new Node(val == 1, true, null, null, null, null);
}
int rowMid = (r1 + r2)/2;
int colMid = (c1 + c2)/2;
return new Node(false, false,
build(r1, c1, rowMid, colMid, g),
build(r1, colMid + 1, rowMid, c2, g),
build(rowMid + 1, c1, r2, colMid, g),
build(rowMid + 1, colMid + 1, r2, c2, g)
);
}
}

05 小结

算法专题目前已连续日更超过两个月,算法题文章91+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

LeetCode算法题-Construct Quad Tree(Java实现)的更多相关文章

  1. LeetCode算法题-Construct String from Binary Tree(Java实现)

    这是悦乐书的第273次更新,第288篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第141题(顺位题号是606).构造一个字符串,该字符串由二叉树中的括号和整数组成,并具 ...

  2. LeetCode算法题-Construct the Rectangle(Java实现)

    这是悦乐书的第243次更新,第256篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第110题(顺位题号是492).对于Web开发人员,了解如何设计网页的大小非常重要.因此 ...

  3. LeetCode算法题-Balanced Binary Tree(Java实现)

    这是悦乐书的第167次更新,第169篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第26题(顺位题号是110).给定二叉树,判断它是否是高度平衡的.对于此问题,高度平衡二 ...

  4. LeetCode算法题-Rotate String(Java实现)

    这是悦乐书的第317次更新,第338篇原创 在开始今天的算法题前,说几句,今天是世界读书日,推荐两本书给大家,<终身成长>和<禅与摩托车维修艺术>,值得好好阅读和反复阅读. 0 ...

  5. LeetCode算法题-Rotated Digits(Java实现)

    这是悦乐书的第316次更新,第337篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第185题(顺位题号是788).如果一个数字经过180度旋转后,变成了一个与原数字不同的 ...

  6. LeetCode算法题-Toeplitz Matrix(Java实现)

    这是悦乐书的第312次更新,第333篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第181题(顺位题号是766).如果从左上角到右下角的每个对角线具有相同的元素,则矩阵是 ...

  7. LeetCode算法题-Flood Fill(Java实现)

    这是悦乐书的第306次更新,第325篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第173题(顺位题号是733).图像由二维整数数组表示,每个整数表示图像的像素值(从0到 ...

  8. LeetCode算法题-Image Smoother(Java实现)

    这是悦乐书的第282次更新,第299篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第150题(顺位题号是661).给定表示图像灰度的2D整数矩阵M,您需要设计一个平滑器以 ...

  9. LeetCode算法题-Design LinkedList(Java实现)

    这是悦乐书的第300次更新,第319篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第168题(顺位题号是707).设计链表的实现.您可以选择使用单链表或双链表.单链表中的 ...

随机推荐

  1. XtraDB/InnoDB的文件格式(已提交到MariaDB官方手册)

    本文为mariadb官方手册:XtraDB/InnoDB File Format的译文. 原文:https://mariadb.com/kb/en/library/xtradbinnodb-file- ...

  2. lua的面向对象

    Lua中的table就是一种对象,但是如果直接使用仍然会存在大量的问题,见如下代码: Account = {balance = } function Account.withdraw(v) Accou ...

  3. WPF 实现ScrollViewer的垂直偏移滚动跳转

    问题:考虑屏幕大小,一般都是会在表单问卷的页面使用ScrollViewer.问卷中问题漏填漏选时,在提交时校验不过,需要滚动跳转至漏填漏选项. 页面如下: 每个选项使用StackPanel,并对复选框 ...

  4. nginx静态资源文件无法访问,403 forbidden错误

    在安装 nginx 服务器后,我想把网站的根目录设置为 /root/www/ ,于是对 nginx 的 nginx.conf 文件进行配置 先打开 nginx.conf #user nobody; w ...

  5. 应用TortoiseGit为github账号添加SSH keys,解决pull总是提示输入密码的问题

    每次同步或者上传代码到githun上的代码库时,需要每次都输入用户名和密码,这时我们设置一下SSH key就可以省去这些麻烦了.若果使用TortoiseGit作为github本地管理工具,Tortoi ...

  6. [PHP]算法-旋转数组的最小值的PHP实现

    把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组 ...

  7. curl模拟请求常用参数

    封装一个curl模拟浏览器请求的函数,如下: /** * curl模拟浏览器请求 * @param unknown $url 请求的地址 * @param array $params 请求地址所需要的 ...

  8. 华硕笔记本的U盘启动

    开机以后有两种方式: 1:按住ESC键,在弹出的见面直接选择USB启动进入. 2:按F2进BLOS进入,在boot里面原则第一个,找到USB作为第一启动项,再按F10保存一下即可.

  9. 四、HTTP控制器

    1.控制器的作用:数据和视图之间的桥梁 2.控制器创建方法: (1)手动创建 <?php namespace App\Http\Controllers; class UserController ...

  10. CSS3属性animation-play-state控制动画运行或暂停的技巧

    animation-play-state介绍 animation-play-state 属性规定动画正在运行还是暂停. div{ animation-play-state:paused; -webki ...