九章算法面试题42 构造MaxTree
增长序列: 从左到右扫描和从右到左,分别记录每个节点左边第一个比自己大的元素,右边第一个。。(使用栈,小于自己的弹出) O(n)。 然后把左右之间较小的那个元素作为自己的父节点。九章算法面试题37 主元素
初阶:采用抵消法+线性扫描, 一遍就能定位到超过1/2的元素
进阶:对1/k次出现的广义主元素,采用k分组。抵消没有重复出现的元素。
九章算法面试题30 最短距离和
初阶:在一个n*m的矩阵中,有k个点,求矩阵中距离这k个点的距离和最近的点。
注:这里的距离采用曼哈顿距离——|x0-x1| + |y0-y1|
进阶:如果要求这个点与所给的k个点不重合,该怎么办?
堆辅助宽搜(O(k*lgk), 取决于所给的特定点个数), 或者线性扫描(O(n*m), 事先预处理每个行列对应的特定点个数,这样每次计算a[i][j]都是O(1)复杂度,总复杂度O(n*m) )
九章算法面试题29 子矩阵的最大公约数
给定n*n的矩阵,需要查询任意子矩阵中所有数字的最大公约数。请给出一种设计思路,对矩阵进行预处理,加速查询。额外的空间复杂度要求O(n^2)以内。
四分线段树 或横纵剖分线段树
初阶:二维dp
进阶:最小费用最大流解法