当前位置: 代码迷 >> 综合 >> (十二)算法设计思想之“分而治之”
  详细解决方案

(十二)算法设计思想之“分而治之”

热度:8   发布时间:2024-02-22 07:43:16.0

算法设计思想之“分而治之”

  • 分而治之是是什么
  • 场景一:归并排序
  • 场景二:快速排序
  • LeetCode:374.猜数字大小
  • LeetCode:226.翻转二叉树
  • LeetCode:100.相同的树
  • LeetCode:101.对称二叉树
  • 思考题

分而治之是是什么

分而治之是算法设计中的一种方法
它将一个问题成多个和原问题相似的小问题,递归解决小问题,再将结果并以解决原来的问题
应用场景:归并排序、快速排序、二分搜索、翻转二叉树…

场景一:归并排序

分:把数组从中间一分为二
解:递归地对两个子数组进行归并排序
合:合并有序子数组

场景二:快速排序

分:选基准,按基准把数组分成两个子数组
解:递归地对两个子数组进行快速排序
合:对两个子数组进行合并

LeetCode:374.猜数字大小

在这里插入图片描述
解题思路
二分搜索,同样具备“分、解、合”的特性
考虑选择分而治之

解题步骤
分:计算中间元素,分割数组
解:递归地在较大或者较小子组件进行二分搜索
合:不需要此步,因为在子数组中搜到就返回了
在这里插入图片描述

时间复杂度O(logn),空间复杂度是O(logn)

LeetCode:226.翻转二叉树

在这里插入图片描述
解题思路
先翻转左右子树,再将子树换个位置
符合“分、解、合”特性
考虑选择分而治之
解题步骤
分:获取左右子树
解:递归地翻转左右子树
合:将翻转后的左右子树换个位置放在根节点上
在这里插入图片描述
时间复杂度O(n),n是树的节点数,空O(树的高度),最坏的情况是O(n)

LeetCode:100.相同的树

在这里插入图片描述
解题思路
两个树:根节点的值相同,左子树相同,右子树相同
符合“分、解、合”特性
考虑选择分而治之
解题步骤
分:获取两个树的左子树和右子树
解:递归地判断两个树的左子树是否相同,右子树是否相同
合:将上述结果合并,如果根节点的值也相同,树就相同

在这里插入图片描述
时间复杂度O(n),n是树的节点数,空间复杂度最坏情况是O(n),好的情况是O(logN)

LeetCode:101.对称二叉树

在这里插入图片描述
解题思路
转化为:左右子树是否镜像
分解为:树1的左子树和树2的右子树是否镜像,树1的右子树和树2的左子树是否镜像
符合“分、解、和”特性,考虑选择分而治之
解题步骤
分:获取两个树的左子树和右子树
解:递归地判断树1的左子树和树2的右子树是否镜像,树1的右子树和树2的左子树是否镜像
合:如果上述都成立,且根节点值也相同,两个树就镜像
在这里插入图片描述
时间复杂度O(n),n是树的节点数,空间复杂度最坏情况是O(n),好的情况是O(logN)

思考题

1、说出分而治之算法的套路步骤
2、用分而治之的套路步骤,描述切西瓜的过程,无需Coding