【LeetCode】427. Construct Quad Tree 解题报告(Python)
作者: 负雪明烛
id: fuxuemingzhu
个人博客: http://fuxuemingzhu.cn/
题目地址:https://leetcode.com/problems/construct-quad-tree/description/
题目描述
We want to use quad trees to store an N x N boolean grid. Each cell in the grid can only be true or false. The root node represents the whole grid. For each node, it will be subdivided into four children nodes until the values in the region it represents are all the same.
Each node has another two boolean attributes : isLeaf and val. isLeaf is true if and only if the node is a leaf node. The val attribute for a leaf node contains the value of the region it represents.
Your task is to use a quad tree to represent a given grid. The following example may help you understand the problem better:
Given the 8 x 8 grid below, we want to construct the corresponding quad tree:

It can be divided according to the definition above:

The corresponding quad tree should be as following, where each node is represented as a (isLeaf, val) pair.
For the non-leaf nodes, val can be arbitrary, so it is represented as *.

Note:
- N is less than 1000 and guaranteened to be a power of 2.
- If you want to know more about the quad tree, you can refer to its wiki.
题目大意
题目很长,但是不要害怕。题目所说的四分树,其实就是平面上的一种集合结构。把一个边长为2的幂的正方形均分成4块,然后再均分到不能均分为止即为叶子节点。类似于树结构,这是一个平面结构。
解题方法
首先,这种结构和树结构非常类似,肯定使用递归求解。重要的是如何判断此树结构如何判断叶子节点、val。
所以定义了一个新的函数,如果一个正方形中所有的数字都是0,则val是False,否则val是True。
判断leaf的方法是看看格子里的所有的值是不是相同的,如果全是0或者1那么就是leaf,否则就不是。
本来应该是两个函数,但是我用一个函数有3个返回值就实现了。
其他的难点就在把正方形进行切分成四块了,这个不是难点。
代码如下:
"""
# Definition for a QuadTree node.
class Node:
def __init__(self, val, isLeaf, topLeft, topRight, bottomLeft, bottomRight):
self.val = val
self.isLeaf = isLeaf
self.topLeft = topLeft
self.topRight = topRight
self.bottomLeft = bottomLeft
self.bottomRight = bottomRight
"""
class Solution:
def construct(self, grid):
"""
:type grid: List[List[int]]
:rtype: Node
"""
isLeaf = self.isQuadTree(grid)
_len = len(grid)
if isLeaf == None:
mid = _len // 2
topLeftGrid = [[grid[i][j] for j in range(mid)] for i in range(mid)]
topRightGrid = [[grid[i][j] for j in range(mid, _len)] for i in range(mid)]
bottomLeftGrid = [[grid[i][j] for j in range(mid)] for i in range(mid, _len)]
bottomRightGrid = [[grid[i][j] for j in range(mid, _len)] for i in range(mid, _len)]
node = Node(True, False, self.construct(topLeftGrid), self.construct(topRightGrid),
self.construct(bottomLeftGrid), self.construct(bottomRightGrid))
elif isLeaf == False:
node = Node(False, True, None, None, None, None)
else:
node = Node(True, True, None, None, None, None)
return node
def isQuadTree(self, grid):
_len = len(grid)
_sum = 0
for i in range(_len):
_sum += sum(grid[i])
if _sum == _len ** 2:
return True
elif _sum == 0:
return False
else:
return None
二刷,换了一种写法,也是递归。
"""
# Definition for a QuadTree node.
class Node(object):
def __init__(self, val, isLeaf, topLeft, topRight, bottomLeft, bottomRight):
self.val = val
self.isLeaf = isLeaf
self.topLeft = topLeft
self.topRight = topRight
self.bottomLeft = bottomLeft
self.bottomRight = bottomRight
"""
class Solution(object):
def construct(self, grid):
"""
:type grid: List[List[int]]
:rtype: Node
"""
N = len(grid)
if N == 1:
return Node(grid[0][0] == 1, True, None, None, None, None)
topLeftSum = sum([grid[i][j] for i in range(N/2) for j in range(N/2)])
topRightSum = sum([grid[i][j] for i in range(N/2) for j in range(N/2, N)])
bottomLeftSum = sum([grid[i][j] for i in range(N/2, N) for j in range(N/2)])
bottomRightSum = sum(grid[i][j] for i in range(N/2, N) for j in range(N/2, N))
node = Node(False, False, None, None, None, None)
if topLeftSum == topRightSum == bottomLeftSum == bottomRightSum:
if topLeftSum == 0:
node.isLeaf = True
node.val = False
elif topLeftSum == (N / 2) ** 2:
node.isLeaf = True
node.val = True
if node.isLeaf:
return node
node.val = True
node.topLeft = self.construct([[grid[i][j] for j in range(N/2)] for i in range(N/2)])
node.topRight = self.construct([[grid[i][j] for j in range(N/2, N)] for i in range(N/2)])
node.bottomLeft = self.construct([[grid[i][j] for j in range(N/2)] for i in range(N/2, N)])
node.bottomRight = self.construct([[grid[i][j] for j in range(N/2, N)] for i in range(N/2, N)])
return node
日期
2018 年 8 月 19 日 —— 天阴阴,地潮潮,这种天气真舒服
2018 年 11 月 13 日 —— 时间有点快
【LeetCode】427. Construct Quad Tree 解题报告(Python)的更多相关文章
- LeetCode 427 Construct Quad Tree 解题报告
题目要求 We want to use quad trees to store an N x N boolean grid. Each cell in the grid can only be tru ...
- leetcode 427. Construct Quad Tree
We want to use quad trees to store an N x N boolean grid. Each cell in the grid can only be true or ...
- 【leetcode】427. Construct Quad Tree
problem 427. Construct Quad Tree 参考 1. Leetcode_427. Construct Quad Tree; 完
- [LeetCode&Python] Problem 427. Construct Quad Tree
We want to use quad trees to store an N x N boolean grid. Each cell in the grid can only be true or ...
- 【LeetCode】654. Maximum Binary Tree 解题报告 (Python&C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 递归 日期 题目地址:https://leetcode ...
- 【LeetCode】100. Same Tree 解题报告(Java & Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 [LeetCode] 题目地址:https:/ ...
- LeetCode 226 Invert Binary Tree 解题报告
题目要求 Invert a binary tree. 题目分析及思路 给定一棵二叉树,要求每一层的结点逆序.可以使用递归的思想将左右子树互换. python代码 # Definition for a ...
- LeetCode 965 Univalued Binary Tree 解题报告
题目要求 A binary tree is univalued if every node in the tree has the same value. Return true if and onl ...
- 【LeetCode】62. Unique Paths 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 题目地址:https://leetcode.com/problems/unique-pa ...
随机推荐
- Xpath解析库的使用
### Xpath常用规则 ## nodename 选取此节点的所有子节点 ## / 从当前节点选取直接子节点 ## // 从当前节点选取子孙节点 ## . 选取当前节点 ## .. 选取当前节点的父 ...
- Linux—yum安装python-pip
centos下安装pip时失败: [root@wfm ~]# yum -y install pipLoaded plugins: fastestmirror, refresh-packagekit, ...
- EXCEL-批量修改列宽
WPS:先用鼠标选中一列,然后,长按ctrl键并且用鼠标选中剩余想要统一列宽的列,松开ctrl键,鼠标落在刚选中的任意一列的抬头上,鼠标右键,选择列宽,设置统一列宽即可.
- MapReduce08 数据清洗(ETL)和压缩
目录 数据清洗(ETL) ETL清洗案例 需求 需求分析 实现代码 编写WebLogMapper类 编写WebLogDriver类 打包到集群运行 压缩 概念 MR支持的压缩编码 压缩算法对比 压缩性 ...
- C/C++ Qt 数据库与ComBox多级联动
Qt中的SQL数据库组件可以与ComBox组件形成多级联动效果,在日常开发中多级联动效果应用非常广泛,例如当我们选择指定用户时,我们让其在另一个ComBox组件中列举出该用户所维护的主机列表,又或者当 ...
- VSCode+Maven+Hadoop开发环境搭建
在Maven插件的帮助下,VSCode写Java其实非常方便.这一讲我们介绍如何借助maven用VScode搭建Hadoop开发环境. 1.Java环境安装 首先我们需要搭建好Java开发环境.我们需 ...
- Scala(七)【异常处理】
目录 一.try-catch-finally 二.Try(表达式).getOrElse(异常出现返回的默认值) 三. 直接抛出异常 一.try-catch-finally 使用场景:在获取外部链接的时 ...
- Flume对接Kafka
目录 一.简单实现 1)flume的配置文件 二.自定义interceptor(使用kafka sink) 1)自定义 flume 拦截器 2)编写 flume 的配置文件 3)创建topic 4)启 ...
- 【MarkDown】--使用教程
MarkDown使用教程 目录 MarkDown使用教程 一. 常用设置 1.1 目录 1.2 标题 1.3 文本样式 (1)引用 (2)高亮 (3)强调 (4)水平线 (5)上下标 (6)插入代码 ...
- clickhouse输入输出格式 TSKV CSV
TSKVTSKV格式不适合有大量小列的输出.TSKV的效率并不比JSONEachRow差.TSKV数据查询和数据导入.不需要保证列的顺序. 支持忽略某些值,这些列使用默认值,例如0和空白行.复杂类型的 ...