[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 exists some
0 < i < A.length - 1
such thatA[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:
3 <= A.length <= 10000
0 <= A[i] <= 10^6
- 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
类似题目:
参考资料:
https://leetcode.com/problems/peak-index-in-a-mountain-array/
分类:
LeetCode
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从二进制到误差:逐行拆解C语言浮点运算中的4008175468544之谜
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· C# 13 中的新增功能实操
· Ollama本地部署大模型总结
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(4)
· 卧槽!C 语言宏定义原来可以玩出这些花样?高手必看!
· langchain0.3教程:从0到1打造一个智能聊天机器人
2017-03-13 [LeetCode] 532. K-diff Pairs in an Array 数组中差为K的数对
2016-03-13 [LeetCode] Palindrome Pairs 回文对