建立四叉树的思路探讨与源码
    建立四叉树的题目如下图,该题属于树类和数组类型的题目,主要考察对于搜索方法的使用和树结构的理解。本文的题目作者想到2种方法,分别是递归方法和二维前缀和方法,其中递归方法使用Java进行编写,而二维前缀和方法使用Python进行编写,当然这可能不是最优的解法,还希望各位大佬给出更快的算法。

    本人认为该题目可以使用递归方法的思路进行解决,首先定义递归函数,在函数内部定义一个标记值,循环遍历寻找元素值是否不等于网格值,如果满足条件就把标记值为false并终止循环。从不同位置开始递归搜索后,直到递归遍历结束并返回结果。那么按照这个思路我们的Java代码如下:

#喷火龙与水箭龟
class Solution {public Node construct(int[][] grid) {return dfs(grid, 0, 0, grid.length, grid.length);}public Node dfs(int[][] grid, int r0, int c0, int r1, int c1) {boolean same = true;for (int ir = r0; ir < r1; ir++) {for (int jr = c0; jr < c1; jr++) {if (grid[ir][jr] != grid[r0][c0]) {same = false;break;}}if (!same) {break;}}if (same) {return new Node(grid[r0][c0] == 1, true);}Node ret = new Node(true,false,dfs(grid, r0, c0, (r0 + r1) / 2, (c0 + c1) / 2),dfs(grid, r0, (c0 + c1) / 2, (r0 + r1) / 2, c1),dfs(grid, (r0 + r1) / 2, c0, r1, (c0 + c1) / 2),dfs(grid, (r0 + r1) / 2, (c0 + c1) / 2, r1, c1));return ret;}
}


    显然,我们的递归方法的效果不错,还可以用二维前缀和方法进行解决。首先计算数组的长度并初始化一个二维数组,然后开始遍历循环并给这个二维数组赋值,同时定义一个求和函数。然后开始定义搜索函数,在函数内部先判断求和的值是否为0或者等于(r1 - r0) * (c1 - c0)的乘积,如果是就继续返回结果,否则就继续迭代搜索,按照这个搜索的思路进行迭代,从数组初使位置进行搜索直到最终结束并返回结果。所以按照这个思路就可以解决,下面是Python代码:

#喷火龙与水箭龟
class Solution:def construct(self, grid: List[List[int]]) -> 'Node':gridLen = len(grid)pre = [[0] * (gridLen + 1) for _ in range(gridLen + 1)]for ir in range(1, gridLen + 1):for jr in range(1, gridLen + 1):pre[ir][jr] = pre[ir - 1][jr] + pre[ir][jr - 1] - pre[ir - 1][jr - 1] + grid[ir - 1][jr - 1]def getSum(r0: int, c0: int, r1: int, c1: int) -> int:return pre[r1][c1] - pre[r1][c0] - pre[r0][c1] + pre[r0][c0]def dfs(r0: int, c0: int, r1: int, c1: int) -> 'Node':total = getSum(r0, c0, r1, c1)if total == 0:return Node(False, True)if total == (r1 - r0) * (c1 - c0):return Node(True, True)return Node(True,False,dfs(r0, c0, (r0 + r1) // 2, (c0 + c1) // 2),dfs(r0, (c0 + c1) // 2, (r0 + r1) // 2, c1),dfs((r0 + r1) // 2, c0, r1, (c0 + c1) // 2),dfs((r0 + r1) // 2, (c0 + c1) // 2, r1, c1),)return dfs(0, 0, gridLen, gridLen)


    从结果来说Java版本的递归方法的效率不错,而Python版本的二维前缀和方法的速度也比较不错,但应该是有更多的方法可以进一步提速的,希望朋友们能够多多指教,非常感谢。

LeetCode刷题——建立四叉树#427#Medium相关推荐

  1. LeetCode刷题(十)----数组-----medium部分(Java、C++)

    LeetCode刷题(十)-----数组-------medium部分(Java.C++) 238. 除自身以外数组的乘积 给定长度为n的整数数组nums,其中n>1,返回输出数组output, ...

  2. LeetCode刷题——消除游戏#390#Medium

    消除游戏的思路探讨与源码     消除游戏的题目如下图,该题属于递归类和数学类型的题目,主要考察对于数学方法的使用和递归方法的理解.本文的题目作者想到2种方法,分别是递归方法和数学模拟方法,其中递归方 ...

  3. 个人LeetCode刷题记录(带题目链接及解答)持续更新

    Leetcode 刷题 注:~[完成]代表还有一些方法没看,最后再看 一.一些需要重刷的典型题: 1.快速排序,归并排序,堆排序(递归的思想) 2.链表中的回文链表,其中的快慢指针,多看,多练 3.链 ...

  4. 卷进大厂系列之LeetCode刷题笔记:二分查找(简单)

    LeetCode刷题笔记:二分查找(简单) 学算法,刷力扣,加油卷,进大厂! 题目描述 涉及算法 题目解答 学算法,刷力扣,加油卷,进大厂! 题目描述 力扣题目链接 给定一个 n 个元素有序的(升序) ...

  5. LeetCode刷题之旅

    LeetCode刷题之旅 一.链表 1.链表逆序(leetcode 206.Reverse Linked List)esay 题目描述:已知链表头节点指针head,将链表逆序. 思路:从链表的头节点依 ...

  6. Leetcode刷题指南和top100题目

    原文链接:https://blog.csdn.net/qq_39521554/article/details/79160815 参考博文:https://blog.csdn.net/mmc2015/a ...

  7. Leetcode刷题——剑指offer_1

    Leetcode刷题--剑指offer_1 剑指offer_03 数组中重复的数字 剑指offer_04 二维数组中元素的查找 剑指offer_05 替换空格 剑指offer_06 从尾到头打印链表 ...

  8. 一个算法笨蛋的12月leetCode刷题日记

    类似文章 一个算法笨蛋的2021年11月leetCode刷题日记 一个算法笨蛋的2021年12月leetCode刷题日记 一个算法笨蛋的2022年1月leetCode刷题日记 一个算法笨蛋的2022年 ...

  9. LeetCode刷题Python实录

    使用Python的LeetCode刷题 前言 题目 1408. 数组中的字符串匹配 508. 出现次数最多的子树元素和 1089. 复写零 剑指 Offer 14- I. 剪绳子 1175. 质数排列 ...

最新文章

  1. VS2005+SQL2005 ASP.NET2.0数据库连接
  2. Windows Phone播放视频流
  3. 压力测试与提升服务器能力的几个方法
  4. opencv精要(3)-win下codelite的opencv配置
  5. python语句大全input_input提示文字 Python基础输入函数,if-else语句,if-elif
  6. java 多线程合并结果集_多线程计算数据,然后合并数据
  7. MDaemon替换注册码怎样人工激活.docx
  8. 【优化分类】基于matlab麻雀算法优化核极限学习机KELM分类【含Matlab源码 1791期】
  9. 最大功率点跟踪测试软件,最大功率点跟踪方法及系统
  10. jdk1.8的安装与环境变量配置
  11. 【饭谈】【超详细】的资深测开的招聘要求,大家看看这符合了值多少钱?
  12. 华为鸿蒙八月,终于来了!华为鸿蒙系统确认8月发布:革命性产品首发搭载
  13. python如何自动生成表情包?
  14. Qt编写可视化大屏电子看板系统10-改造QCustomPlot
  15. 【学习笔记】李宏毅-机器学习MachineLearning
  16. 深度学习系列笔记——贰 (基于Tensorflow2 Keras搭建的猫狗大战模型 三)
  17. 蓝桥杯 STEMA 考试 C++ 编程题模拟题
  18. 从国家统计局获取最新国家省市区的行政区域数据
  19. 最新发布:2022斯坦福AI指数报告
  20. 山寨版鸟巢体育馆图片网络曝光(组图)

热门文章

  1. 【Python杂项】with open() as f的用法
  2. Video标签事件与属性
  3. 5G NR 缩写和定义
  4. 私募创业之思勰:走到最后留下的还是价值观一致的人
  5. wxpython 安装_wxPython安装
  6. 教师基本功大赛计算机试题及答案,信息技术教师基本功比赛笔试及答案
  7. 【克隆】——Object类clone方法彻底剖析
  8. Javah生成JNI头文件,老忘记,写下来!
  9. 阶跃函数卷积自己_详细推导卷积算法
  10. “ 很多事情根本没你想象的那么难,大胆一点去尝试,只要你尽了自己最大努力,其它就交给时间吧。有时候去是缘分,不去也不一定不好,说不定有更好的再后面等着你。我觉得上天给我的,总是比我要的多的多。 ”