注: 本题解为个人完成,难免有疏漏,请勿抄袭,仅供参考,同时欢迎留言指正。 ## 7.1 用朴素的两层遍历当然可以,也可以基于归并排序或堆排序进行改进。
7.4
(1)
一般不作说明的要求分析复杂度,考虑最坏情况即可:
(2)
分治的思想,原数组分为左右两个部分,相当于可以先解决两个子问题,然后合并两个排序好的部分即可。
复杂度即
即复杂度为
7.5
(1)
- 计算左右子树的高度
- 树高就是
复杂度
(2)
首先按照上一问的思想,我们可以用O(n)的复杂度,给树的每个节点标注高度。然后直径用分治来解决就很容易:
- 首先计算左子树、右子树两个子问题的直径
- 然后原树直径
空间复杂度和时间复杂度都是
- 首先计算左子树、右子树两个子问题的直径
和树高 - 然后原树直径
,原树高 ,同时返回原树的高和直径即可。
注:有的同学利用两次dfs来找直径,也是可以的。即从根出发dfs,找到最远的节点,该节点一定是直径的端点;然后以该端点再做一次dfs,找到最远的另一个端点,就可以找到直径。