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

01 看题和准备

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

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

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

image

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

image

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

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

image

注意:

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+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

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

quadtree java_LeetCode算法题-Construct Quad Tree(Java实现)相关推荐

  1. quadtree java_LeetCode算法题-Quad Tree Intersection(Java实现)

    这是悦乐书的第260次更新,第273篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第127题(顺位题号是558).四叉树是树数据,其中每个内部节点恰好有四个子节点:top ...

  2. add binary java_LeetCode算法题-Add Binary(Java实现)

    这是悦乐书的第157次更新,第159篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第16题(顺位题号是67).给定两个二进制字符串,返回它们的总和(也是二进制字符串).输 ...

  3. min java_LeetCode算法题-Min Stack(Java实现)

    这是悦乐书的第177次更新,第179篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第36题(顺位题号是155).设计一个支持push,pop,top和在恒定时间内检索最小 ...

  4. island of java_LeetCode算法题-Island Perimeter(Java实现)

    这是悦乐书的第238次更新,第251篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第105题(顺位题号是463).您将获得一个二维整数网格形式的地图,其中1代表土地,0代 ...

  5. largest number java_LeetCode算法题-Largest Number At Least Twice of Others(Java实现)

    这是悦乐书的第308次更新,第328篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第177题(顺位题号是747).在给定的整数数组中,总有一个最大的元素.查找数组中的最大 ...

  6. leetcode 用java_LeetCode算法题-Heaters(Java实现)

    这是悦乐书的第239次更新,第252篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第106题(顺位题号是475).冬天来了!您在比赛期间的第一份工作是设计一个固定温暖半径 ...

  7. power of two java_LeetCode算法题-Power Of Two(Java实现)

    这是悦乐书的第194次更新,第200篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第56题(顺位题号是231).给定一个整数,写一个函数来确定它是否是2的幂.例如: 输入 ...

  8. magic square java_LeetCode算法题-Magic Squares In Grid(Java实现)

    这是悦乐书的第326次更新,第349篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第196题(顺位题号是840).3 x 3魔方是一个3 x 3网格,填充了从1到9的不同 ...

  9. 427. Construct Quad Tree

    1,题目要求 We want to use quad trees to store an N x N boolean grid. Each cell in the grid can only be t ...

最新文章

  1. docker mac python_Docker Python 例子
  2. oracle9i安装不上,终于成功安装oracle9i了(Cent OS 4.0+oracle9204)
  3. 电动力学每日一题 2021/10/10
  4. BZOJ1951 [Sdoi2010]古代猪文 【费马小定理 + Lucas定理 + 中国剩余定理 + 逆元递推 + 扩展欧几里得】...
  5. python调用opengl_Python运行OpenGL示例
  6. NSOperationQueue简介
  7. 用Python解决百马百瓦
  8. js判断是否支持webgl_基于WebGL无插件虚拟场景漫游关键技术(完全版)ThingJS
  9. Pytorch 入门之数据处理 -- Dataset、Sampler、DataLoader
  10. AD模式下出现NetLogon 5781错误的对策
  11. linux下svn安装与版本控制
  12. 云服务器 微信支付开发,WeX5怎么样实现支付宝和微信支付接口
  13. 九款个人知识管理工具介绍
  14. 悦动圈跑步 随意提交步数 重大BUG漏洞 希望官方早些修复
  15. matlab——非线性规划
  16. ‘0‘、“0“、0、‘\0‘的区别
  17. 模拟退火算法求解--顺序约束的路由部署问题
  18. 如何测量二极管的正负极
  19. 用Photoshop制作2寸照片方法
  20. 【附源码】Python计算机毕业设计人脸识别考勤系统

热门文章

  1. 乳腺癌标志物解决方案
  2. 百战RHCE(第三十一战:linux高级应用-SElinux极简应用2)
  3. 汽车电子系统网络安全组织管理
  4. 实例讲解扁平化设计的步骤和要点
  5. html数字显示百分比,扣丁学堂html5 教程之Canvas实现圆形进度条并显示数字百分比效果...
  6. 阿里云ECS流量计算
  7. AlexNet分类学习
  8. 18.3/18.4/18.5 用keepalived配置高可用集群
  9. 陶瓷厚膜压力传感器简介
  10. 计算机动画制作第一节教案,付雪_ 第四章动画制作_第一节制作逐帧动画——教案设计(7页)-原创力文档...