计算复杂度
计算复杂度(Computational Complexity)是计算机科学中的一个核心概念,它用于描述解决特定问题所需的计算资源量,通常是指时间和空间资源的量度。计算复杂度理论试图理解和分类计算任务的难度,并确定哪些问题是容易解决的,哪些问题是难以解决的。
计算复杂度包括时间复杂度和空间复杂度:
-
时间复杂度:衡量算法执行所需时间的多少。它通常用大O符号(O-notation)来表示,例如O(n)、O(n^2)、O(log n)等,其中n代表输入数据的大小。
-
空间复杂度:衡量算法执行过程中需要的存储空间的多少。同样,它也使用大O符号来表示。
不同的场景,其计算复杂度的类别不同,复杂度类别可分为:
-
常数复杂度(O(1)):无论输入数据量多大,算法所需的时间和空间都保持不变。
-
对数复杂度(O(log n)):算法的资源需求随输入数据量的增长而按对数增长。
-
线性复杂度(O(n)):算法的资源需求与输入数据量成正比。
-
线性对数复杂度(O(n log n)):算法的资源需求与输入数据量的线性对数成正比,常见于某些高效的排序算法。
-
二次复杂度(O(n^2)):算法的资源需求与输入数据量的平方成正比,常见于简单的双层循环算法。
-
指数复杂度(O(2^n)):算法的资源需求随输入数据量呈指数级增长,这类算法通常不实用,因为它们随输入规模的增长而迅速变得非常耗时。
-
阶乘复杂度(O(n!)):算法的资源需求随输入数据量呈阶乘级增长,常见于解决旅行商问题等组合优化问题。
二叉树的最大深度
如果我们知道了左子树和右子树的最大深度 lll 和 rrr,那么该二叉树的最大深度即为
max
(
l
,
r
)
+
1
\max(l,r)+1
max(l,r)+1而左子树和右子树的最大深度又可以以同样的方式进行计算。因此我们可以用「深度优先搜索」的方法来计算二叉树的最大深度。具体而言,在计算当前二叉树的最大深度时,可以先递归计算出其左子树和右子树的最大深度,然后在 O(1)
时间内计算出当前二叉树的最大深度。递归在访问到空节点时退出
# Definition for a binary tree node
# class TreeNode:
# def __init__(self, val=0, right=None, left=None):
# self.val = val
# self.right = right
# self.left = left
class Solution:
def maxDepth(self, root:Optional[TreeNode]) -> int:
if root is None:
return 0
else:
left_height = self.maxDepth(root.left)
right_height = self.maxDepth(root.right)
return max(left_height, right_height) +1
- 这种嵌套结构,就好比scrapy 里面对所有网站的爬取,从根网址开始,对所有网址记录的网址进行跳转。不同的是,这里是二叉树,所以一个节点最多只有两个分支。
root: Optional[TreeNode]
表示root参数是一个可选的TreeNode类型。这意味着root可以是一个TreeNode对象,也可以是None。
https://leetcode.cn/problems/maximum-depth-of-binary-tree/solutions/349250/er-cha-shu-de-zui-da-shen-du-by-leetcode-solution/