文章目录
- 寻找峰值 peak
- 暴力算法
- 分而治之
- 从1D到2D
- 朴素算法
- Attemp#2
寻找峰值 peak
给出一个数组 a b c d e f g h i
并给予数字 index 1 2 3 4 5 6 7 8 9
那么如果某个数字是 peak
,那么他将 大于等于左边的数
且 大于等于右边的数
或者 a >= b
这里的 a 也是峰值
暴力算法
简单的暴力算法思路即:从左往右遍历
复杂度显然为:O(n)
那么看看能否改进一下暴力算法?
分而治之
Use a divide and conquer strategy, and recursively break;
判断 a[n/2] 和 a[n/2-1]
和 a[n/2] 和 a[n/2+1]
进行二分答案搜索
这就使得复杂度降为:
在同样情况下,运行暴力算法需要13秒,使用分而治之策略只花0.001秒
详细的算法实现可以参考:CSDN 作者链接
从1D到2D
一维的问题解决了,那么思考如果问题来到二维呢?
此时的 peek 会定义为 a>=b, a>=c, a>=d, a>=e
朴素算法
课中的教师称之为 Greedy Ascent 算法,从一个地方出发,逐渐往最高的数字移动:
Attemp#2
- 寻找一个 Middle Column,即
j = m / 2
- Find global maximum on Column j at
(i, j)
- 比较
(i, j-1)
(i, j)
(i, j+1)
- 如果
(i, j-1) > (i, j)
选择左边的一列! - 最终,如果
(i, j) >= (i ,j-1), (i, j+2)
,那么(i, j)
就是一个 2D peak