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

145 阅读3分钟

@TOC

分而治之是是什么

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

场景一:归并排序

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

场景二:快速排序

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

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