作者: 负雪明烛
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:

  1. N is less than 1000 and guaranteened to be a power of 2.
  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)的更多相关文章

  1. 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 ...

  2. 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 ...

  3. 【leetcode】427. Construct Quad Tree

    problem 427. Construct Quad Tree 参考 1. Leetcode_427. Construct Quad Tree; 完

  4. [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 ...

  5. 【LeetCode】654. Maximum Binary Tree 解题报告 (Python&C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 递归 日期 题目地址:https://leetcode ...

  6. 【LeetCode】100. Same Tree 解题报告(Java & Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 [LeetCode] 题目地址:https:/ ...

  7. LeetCode 226 Invert Binary Tree 解题报告

    题目要求 Invert a binary tree. 题目分析及思路 给定一棵二叉树,要求每一层的结点逆序.可以使用递归的思想将左右子树互换. python代码 # Definition for a ...

  8. 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 ...

  9. 【LeetCode】62. Unique Paths 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 题目地址:https://leetcode.com/problems/unique-pa ...

随机推荐

  1. 模拟串口UART的实现

    我所祷告的,就是要你们的爱心,在知识和见识上,多而又多,使你们能分辨是非,做诚实无过的人,直到基督的日子.--腓立比书[1:9~10] 最近在调的MCU的型号为STM32F030,配置芯片相较之前的M ...

  2. MediaPlayer详解

    [1]MediaPlayer 详细使用细则 [2]MediaPlayer使用详解_为新手准备 [3]MediaPlayer 概览

  3. Android中的性能优化

    由于手机硬件的限制,内存和CPU都无法像pc一样具有超大的内存,Android手机上,过多的使用内存,会容易导致oom,过多的使用CPU资源,会导致手机卡顿,甚至导致anr.我主要是从一下几部分进行优 ...

  4. HongYun-ui搭建记录

    vue项目windows环境初始化 Element-ui使用 vue2 页面路由 vue SCSS 在VUE项目中使用SCSS ,对SCSS的理解和使用(简单明了) vue axios vue coo ...

  5. Output of C++ Program | Set 11

    Predict the output of following C++ programs. Question 1 1 #include<iostream> 2 using namespac ...

  6. linux如何安装缺失依赖

    这里要提到一个网站https://pkgs.org/,他是linux系统的一个相关网站,里面都是相关内容 Warning: RPMDB altered outside of yum. ** Found ...

  7. SpringAOP简单例子

    这个只是个简单AOP例子,包括前置通知,后置通知,环绕通知,和目标对象.写这个例子的主要目标只是想让想学AOP的能更快地入门,了解一下如何去配置AOP里面的东东.目标对象的接口:IStudent.ja ...

  8. 用oracle中的Row_Number实现分页

    Row_Number实现分页   1:首先是 select ROW_NUMBER() over(order by id asc) as 'rowNumber', * from table1 生成带序号 ...

  9. 【Linux】【Basis】网络

    Linux网络属性配置                           计算机网络:          TCP/IP:协议栈(使用)             ISO,OSI:协议栈(学习)     ...

  10. 使用cookie记录用户上次访问网页的时间,并返回到页面

    package com.hopetesting.cookie;import javax.servlet.ServletException;import javax.servlet.annotation ...