2D Peak Finding - HolmesJJ/Data-Structures-and-Algorithms GitHub Wiki
题目
峰值元素是指其值⼤于上下左右相邻值的元素。给定⼀个二维数组arr,找到峰值并返回其索引。二维数组可能包含多个峰值,返回任何⼀个峰值所在位置即可。
图解
详解
分治思想
定义:将一个难以解决的大问题分割成些规模小的相同问题,以便各击破,分而治之
- 分解:将原问题分解为若干个规模较小。相互独立,与原问题形式相同的子问题
- 解决:若子问题规模小而容易被解决则直接解否则递归地解各子问题
- 合并:将各个子问题的解台并为原问题的解
算法思路
算法1:顺序搜索 (Brute Force)
- 思路:从左上⻆[0][0]到右下⻆[n][m]遍历每个元素,依次与上下左右的元素⽐较
- T(m, n) = O(mn)
算法2:全局最大值Global Max和局部最大值Local Max
- 思路:
- 找到每一列的最大值C1, C2, Cm O(mn)
- 所有每一列的最大值按顺序排成一列Lm
- 找到Lm中的局部峰值O(logm)
- T(m, n) = O(mn) + O(logm)
算法3:全局最大值Global Max和局部最大值Local Max(二分搜索)
-
思路:与算法1类似,但不需要先找到每一列的最大值,根据给定的二维数组可得知Lm肯定有m个元素,因此可以先对空数组Lm使用寻找峰值法,根据mid指针的位置找到Lm中对应的空元素所代表的列的最大值,比较相邻值判断爬升方向
- 找到Lm中的局部峰值
- 根据mid指针的位置,找到Lm中对应的空元素所代表的列的最大值 0(n)
- 只比较相邻值判断爬升方向
- 最后的一列肯定是纵向最大值,横向峰值
-
时间复杂度分析
算法4:分治思想
-
思路:
- 对二维数组做如上图的划分,形成四个子区域
- 找到“田”字上的最大元素a
- 若a是峰值,则返回a;否则进入比a大(或等于)的元素所在的区域,递归求解
- 图中“田”字上最大元素为20,上方22比它大,进入上方的子区域继续求解
-
时间复杂度分析