Let's call an array `A` a *mountain* if the following properties hold:

  • A.length >= 3
  • There exists some 0 < i < A.length - 1 such that A[0] < A[1] < ... A[i-1] < A[i] > A[i+1] > ... > A[A.length - 1]

Given an array that is definitely a mountain, return any i such that A[0] < A[1] < ... A[i-1] < A[i] > A[i+1] > ... > A[A.length - 1].

Example 1:

Input: [0,1,0]
Output: 1

Example 2:

Input: [0,2,1,0]
Output: 1

Note:

  1. 3 <= A.length <= 10000
  2. 0 <= A[i] <= 10^6
  3. A is a mountain, as defined above.

这道题定义了一种山形的数组,说是有一个最高点,然后向两边各自降低,让我们找出山峰的位置。其实这道题跟之前那道 [Find Peak Element](http://www.cnblogs.com/grandyang/p/4217175.html) 非常的类似,只不过那道题有很多局部峰值,而这里道题只有一个全局峰值。题目中限定了山峰一定存在,即一定有一个最高点,反应在数组中就是最大值,那么问题就转换为了求数组中最大值的位置,最简单直接的方法就是遍历数组找出最大值的位置即可,这里使用了 STL 的内置函数 max_element() 来一行解题,参见代码如下:

解法一:

class Solution {
public:
int peakIndexInMountainArray(vector<int>& A) {
return max_element(A.begin(), A.end()) - A.begin();
}
};

由于题目中限定了山峰一定存在,所以我们也可以直接直接来找第一个下降的位置,即 A[i] > A[i+1] 的地方,那么i位置一定就是山峰了,注意i的遍历范围要去掉首尾两个数字,参见代码如下:


解法二:

class Solution {
public:
int peakIndexInMountainArray(vector<int>& A) {
for (int i = 1; i < (int)A.size() - 1; ++i) {
if (A[i] > A[i + 1]) return i;
}
return 0;
}
};

上面两种解法都是线性的时间复杂度,能不能更快一点呢?那么就只有使用二分搜索法来加快搜索速度了,其实这是博主的总结帖 [LeetCode Binary Search Summary 二分搜索法小结](http://www.cnblogs.com/grandyang/p/6854825.html) 中的第五类情况,跟前的稍有不同的是 right 的初始化,之前的情况博主基本上都是用数组长度初始化 right 的,但是这里要用数组长度减1来初始化 right,因为要跟紧邻的右边的数字比较,这样初始化 right 的意义在于 mid+1 就不会越界了,参见代码如下:


解法三:

class Solution {
public:
int peakIndexInMountainArray(vector<int>& A) {
int n = A.size(), left = 0, right = n - 1;
while (left < right) {
int mid = left + (right - left) / 2;
if (A[mid] < A[mid + 1]) left = mid + 1;
else right = mid;
}
return right;
}
};

Github 同步地址:

https://github.com/grandyang/leetcode/issues/852

类似题目:

Find Peak Element

参考资料:

https://leetcode.com/problems/peak-index-in-a-mountain-array/

https://leetcode.com/problems/peak-index-in-a-mountain-array/discuss/139848/C%2B%2BJavaPython-Better-than-Binary-Search

LeetCode All in One 题目讲解汇总(持续更新中...)

[LeetCode] Peak Index in a Mountain Array 山形数组的顶峰坐标的更多相关文章

  1. LeetCode 852. Peak Index in a Mountain Array (山脉数组的峰顶索引)

    题目标签:Binary Search 题目给了我们一组 int array,让我们找到数组的 peak. 利用 binary search, 如果数字比它后面那个数字小,说明还在上坡,缩小范围到右半边 ...

  2. LeetCode 852. Peak Index in a Mountain Array C++ 解题报告

    852. Peak Index in a Mountain Array -- Easy 方法一:二分查找 int peakIndexInMountainArray(vector<int>& ...

  3. Leetcode之二分法专题-852. 山脉数组的峰顶索引(Peak Index in a Mountain Array)

    Leetcode之二分法专题-852. 山脉数组的峰顶索引(Peak Index in a Mountain Array) 我们把符合下列属性的数组 A 称作山脉: A.length >= 3 ...

  4. 【Leetcode_easy】852. Peak Index in a Mountain Array

    problem 852. Peak Index in a Mountain Array solution1: class Solution { public: int peakIndexInMount ...

  5. 【LeetCode】852. Peak Index in a Mountain Array 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 二分查找 查找最大值位置 寻找第一个下降的位置 日期 ...

  6. C#LeetCode刷题之#852-山脉数组的峰顶索引(Peak Index in a Mountain Array)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/4003 访问. 我们把符合下列属性的数组 A 称作山脉: A.le ...

  7. LeetCode 852 Peak Index in a Mountain Array 解题报告

    题目要求 Let's call an array A a mountain if the following properties hold: A.length >= 3 There exist ...

  8. LeetCode算法题-Peak Index in a Mountain Array(Java实现)

    这是悦乐书的第329次更新,第352篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第199题(顺位题号是852).如果以下属性成立,我们将数组A称为山: A.length ...

  9. LeetCode 852. Peak Index in a Mountain Array(C++)

    Let's call an array A a mountain if the following properties hold: A.length >= 3 There exists som ...

随机推荐

  1. MySQL ERROR 1045 (28000)

    mysql ERROR 1045 (28000): Access denied for user 'ODBC'@'localhost' (using password: YES) 到配置文件my.in ...

  2. zabbix4.0添加磁盘io监控

    agent服务器端的操作 1.设置zabbix-agent端的配置文件 找到agent端配置文件的位置,本例agent端的配置文件路径在/usr/local/etc/zabbix下 首先:在主配置文件 ...

  3. [转] iOS11.3 fastclick.js相关bug

    最近遇到奇异的bug,在ios 11.3移动端页面 input输入框第一次触摸可以弹起键盘,后续再触摸需要很难弹起键盘,或者需要在输入框停一会才能弹起键盘. bug复现条件: 一.ios 11.3中a ...

  4. 为什么要使用getters和setters/访问器?

    Why use getters and setters/accessors? 实际上会有很多人问这个问题....尤其是它成为Coding Style中一部分的时候. 文章出自LBushkin的回答 T ...

  5. read()和write()

    1.write() 函数定义:ssize_t write (int fd, const void * buf, size_t count); 函数说明:write()会把参数buf所指的内存写入cou ...

  6. net core EF 链接mysql 数据库

    这个主要是一个demo.就在一个工程里面写的 安装MySql.Data.EntityFrameworkCore 增加DbContext 相当于程序与数据库的中间层 public class Ident ...

  7. 使用chrome-devtools定位元素

    2.1使用chrome-devtools 这是谷歌提供的一个移动端Web开发调试工具,通过它我们可以调试手机页面.通过调试我们可以看到wap页面的源码,从而进行元素的定位.那么这个工具该如何使用呢?首 ...

  8. ImCash:韩国最大交易所遭遇至暗时刻:2018年亏损1.8亿美元

    Bithumb上个月遭到黑客攻击,随后要求用户小心存款,该公司报告称损失1.8亿美元(合2050亿韩元). 据<韩国时报>(Korea Times)报道:受到熊市影响,数字货币交易所实际交 ...

  9. <算法图解>读书笔记:第4章 快速排序

    第4章 快速排序 4.1 分而治之 "分而治之"( Divide and conquer)方法(又称"分治术") ,是有效算法设计中普遍采用的一种技术. 所谓& ...

  10. Capslock+ 键盘党都爱的高效利器 - 让 Windows 快捷键操作更加灵活强大

    Capslock+ 键盘党都爱的高效利器 - 让 Windows 快捷键操作更加灵活强大  优化辅助    Windows   2016-06-05 91,167   微博微信QQ空间印象有道邮件   ...