一、1D情况

假设有一个如下图的一维数组,格子下的数字代表它们的索引位置,格子内的字母代表该位置内的数值。

峰值的定义:当且仅当 b≥a 且 b≥c 时,位置2为峰值。(如果位置位于数组两个边界,则只需要比较另一个方向。如当 a≥b 时,位置1为峰值。)

寻峰:如果峰值存在,找到峰值所在的位置。(注意,由于定义时使用了大于等于,在此定义下数组内必定至少存在一个位置满足峰值的定义,因此此时不需要考虑峰值不存在的情况)

1、遍历

最简单且最直接的峰值寻找方式就是遍历,遍历数组内的每一个位置,若该位置内的元素满足峰值定义,则该位置就是峰值。

时间复杂度:O(n),在最坏的情况下需要访问数组内的每一个元素。

2、二分(分治思想)

二分寻找峰值法主要步骤(假设数组为a,长度为n):

  • 找到中间位置数值 a[n2\frac{n}{2}2n​]
  • if a[n2\frac{n}{2}2n​] < a[n2−1\frac{n}{2}-12n​−1],数值变化如下图所示,在 a[n2\frac{n}{2}2n​] 左边肯定会存在峰值,则在左边 1 到 n2−1\frac{n}{2}-12n​−1 内寻找峰值
  • else if a[n2\frac{n}{2}2n​] < a[n2+1\frac{n}{2}+12n​+1],也就是说,a[n2−1\frac{n}{2}-12n​−1] 已经小于或者等于 a[n2\frac{n}{2}2n​] 了,数值变化如下图所示。在 a[n2\frac{n}{2}2n​] 右边肯定会存在峰值,则在右边 n2+1\frac{n}{2}+12n​+1 到 n 内寻找峰值
  • else 位置 n2\frac{n}{2}2n​ 就是峰值

时间复杂度:O(log2nlog_2nlog2​n)

刷题正好碰到(leetcode 852. 山脉数组的峰顶索引),补上C++代码实现:
需要留意 mid==0mid==0mid==0 和 mid==arr.size()−1mid==arr.size()-1mid==arr.size()−1 时两种情况

class Solution {public:int peakIndexInMountainArray(vector<int>& arr) {int l=0;int r=arr.size()-1;while(l<r){int m=(l+r)/2;if(m==0){if(arr[m]<arr[m+1]){l=m+1;}else return m;}if(m==arr.size()-1){if(arr[m]<arr[m-1]){r=m-1;}else return m;}if(m!=0 && m!=arr.size()-1){if(arr[m]<arr[m-1]){r=m-1;}else if(arr[m]<arr[m+1]){l=m+1;}else return m;}}return r;}
};

二、2D情况

假设有一个如下图的二维数组。

峰值的定义:当且仅当 a≥b 且 a≥c 且 a≥d 且 a≥e 时,a所在位置为峰值。

同样有两种方法找到峰值所在位置

1、贪心上升

在某个开始位置执行贪心算法,在该位置处,向上下左右四个方向中,上升度最高的方向移动。若四个方向的上升度都小于等于0,则所在位置为峰值。

贪心算法执行举例:在12处,上升度分别为向左的1,向下的-1。最高的是13所在的左方向,所以向左移动到达13。同理13处继续向左移动到达14。整个移动过程最终到达20,即为该二维数组的峰值。

时间复杂度:O(mn),在最坏的情况下,贪心算法可能需要走遍整个二维数组内的每一个元素,所以时间复杂度是O(mn)

2、分治

  • 找到中间列 j = m/2

  • 遍历 j 列, 找到 j 列中最大的元素 (i, j)

  • if (i,j-1)>(i,j),选择左边部分,1 列到 j-1 列,重复以上步骤。

  • else if (i,j+1)> (i,j),到这一步条件判断已经意味着(i,j-1)≤ (i,j),选择右边部分,j+1 列到 m 列,重复以上步骤

  • else 到这一步条件判断意味着(i,j)左边右边均小于或等于它,而(i,j)又是 j 列中最大的元素,所以(i,j)是二维数组的峰值

时间复杂度:O(nlog2mlog_2mlog2​m),遍历列寻找最大值时的时间复杂度为O(n),选择列时使用了二分的方式,时间复杂度为O(log2mlog_2mlog2​m)

[MIT6.006 算法导论] 1. Peak Finding 寻峰相关推荐

  1. Python语言程序设计之urllib.request抓取页面,网易公开课之《麻省理工学院公开课:算法导论》

    Python语言用urllib.request模块抓取页面非常简单,再将抓取的页面内容用re模块解析,找出自己想要的东西.下面就就此方法来抓取网易公开课之<麻省理工学院公开课:算法导论>, ...

  2. 组合数学 算法导论 具体数学 博弈论 计算机科学数学

    组合数学[清华大学] https://www.bilibili.com/video/BV1sW411V7RU 15日掌握<具体数学>第1天学习直播实况记录(2019.5.27) https ...

  3. 算法设计与分析_算法导论(CLRS)骨灰级笔记分享:目录

    倘若你去问一个木匠学徒:你需要什么样的工具进行工作,他可能会回答你:"我只要一把锤子和一个锯".但是如果你去问一个老木工或者是大师级的建筑师,他会告诉你"我需要一些精确的 ...

  4. 算法导论Java实现-构建MaxHeap

    package lhz.algorithm.chapter.six; /** * "构建堆",<算法导论>6.3章节 Building a heap * 利用之前实现的 ...

  5. 算法导论读书笔记-第十九章-斐波那契堆

    算法导论第19章--斐波那契堆 可合并(最小)堆(mergeable min-heap) : 支持以下5种操作的一种数据结构, 其中每一个元素都有一个关键字: MAKE-HEAP(): 创建和返回一个 ...

  6. 《算法导论》读书笔记--第三章 函数的增长

    好长时间了,继续算法导论. 当输入规模足够大时,并不计算精确的运行时间,倍增常量和低阶项被舍去.我们要研究的是算法的渐近效率,即在输入规模无限量时,在极限中,算法的运行时间如何随着输入规模的变大而增加 ...

  7. 《算法导论》中parallel for 的时间复杂度

    最近在看<算法导论>,看到多线程算法这章中,有一个parallel for循环的例子,如下: parallel for i = 1 to n        parallel for j = ...

  8. 算法导论中求解时间复杂度的三种方法

    这一章讲的是递归式(recurrence),递归式是一组等式或不等式,它所描述的函数是用在更小的输入下该函数的值来定义的. 本章讲了三种方法来解递归式,分别是代换法,递归树方法,主方法. 1.代换法( ...

  9. 算法导论Java实现-随机化数组的两种方式(5.3章节)

    package lhz.algorithm.chapter.five; /** * 随机数组两种实现,<算法导论>第五章第三节 * 本文地址:http://mushiqianmeng.bl ...

最新文章

  1. 两度延期,K项目终于要开工了!
  2. Java code lib aes 加解密
  3. linux 查看flash大小,Linux OpenWRT查看CPU,RAM,Flash信息参数
  4. 安卓系统辅助功能中的指针停止移动后点击是什么?OTG
  5. 【BZOJ5469】[FJOI2018]领导集团问题(动态规划,线段树合并)
  6. web前端分享:性能优化之文档碎片处理
  7. Struts2框架原理
  8. 浅谈HashMap的实现原理
  9. CMDB学习之三数据采集
  10. C#获取文件(磁盘驱动器)的关联图标(使用API SHGetFileInfo)
  11. Linux的铜墙铁壁:防火墙之iptables
  12. CToolBarCtrl工具栏设置总结(转)
  13. android tv 蓝牙服务_5款面向Android TV的优秀文件管理器
  14. 小米 android 7.0下载地址,小米4安卓7.0
  15. hart协议服务器,基于HART协议智能仪表的在线管理系统的设计与实现
  16. 眨眼视频制作与生成活体视频生成
  17. 【.Net】asp.net 把图片从CMYK印刷模式转换为RGB原色模式
  18. android l fox x86,【原创】X61T笔触(无手触)安卓(X86)系统真正完美
  19. SylixOS中的中断接口基础实现
  20. 服务器2012怎么换桌面背景,Windows Server 2012 R2桌面化详细设置图解

热门文章

  1. saas模式人力资源管理系统
  2. 帆软BI工具Fine BI连接数据库
  3. 有一群志同道合的程序员朋友是怎样的体验?
  4. Nature :利用基因编辑技术进行高产玉米研究新进展
  5. 【21天学习挑战赛学习打卡】顺序查找
  6. 数据库设计三大范式之第一范式不可违反
  7. 误删excel表格数据都没了怎么恢复
  8. 为什么苹果日历不能设置日程_iphone6提醒事项加入日历怎么不提醒我 到时
  9. 第四届蓝桥杯JavaA组省赛真题
  10. 数影周报:SpaceX设计图纸被泄露,拍明芯城正式在纳斯达克上市