寻找峰值
描述
山峰元素是指其值大于或等于左右相邻值的元素。给定一个输入数组nums,任意两个相邻元素值不相等,数组可能包含多个山峰。找到索引最大的那个山峰元素并返回其索引。假设 nums[-1] = nums[n] = -∞。方法一
思路分析
本题相对简单,首先对本题题意进行理解,寻找到的峰值为数组元素中最后的峰值,只需要判断前一个值是否小于当前值就可判断是否为山峰,因此只需要循环遍历一次即可找到最后的峰值。
图解
核心代码
class Solution {
public:
/**
* 寻找最后的山峰
* @param a int整型一维数组
* @param aLen int a数组长度
* @return int整型
*/
int solve(int* a, int aLen) {
// write code here
int index =0;
int max_element=a[0];
for(int i=1;i<aLen;i++)
{
if(a[i]>a[i-1])
{
index=i;//只需要判断前一个值是否小于当前值就可判断是否为山峰
}
}
return index;
}
}; 复杂度分析 - 时间复杂度:循环遍历一次,所需时间复杂度为$O(n)$
- 空间复杂度:空间复杂度为$O(1)$
方法二
思路分析
在寻找第二种办法时,我想到了金字塔数组的题目,金字塔数组中先找到所有的波谷,然后寻找波谷间距最大的值,与金字塔数组不同的是,本题需要找所有的波峰,为了便于计算,需要在开始位置与结束位置额外进行比较两个极小值,用于判断开始位置与结束位置是否为波峰。
图解
核心代码
class Solution {
public:
/**
* 寻找最后的山峰
* @param a int整型一维数组
* @param aLen int a数组长度
* @return int整型
*/
int solve(int* a, int aLen) {
// write code here
int index=0;
for(int i=0;i<aLen;i++)
{
if(i==0)//单独判断开始位置是否为山峰
{
if(a[i]>INT_MIN&&a[i]>a[i+1])
index=i;
}
else if(i==aLen-1)//单独判断结束位置是否为山峰
{
if(a[i]>INT_MIN&&a[i]>a[i-1])
index=i;
}
else
{
if(a[i]>a[i-1]&&a[i]>a[i+1])//找到所有的山峰
index=i;
}
}
return index;//返回最后一个山峰的下标
}
}; 复杂度分析 - 时间复杂度:循环遍历一次数组,时间复杂度为$O(n)$
- 空间复杂度:空间复杂度为$O(1)$

京公网安备 11010502036488号