寻找峰值这个题,牛客网的要求的是索引最大的那个山峰元素的索引,也就是最后一个山峰的索引,而leetcode上的只要它是山峰就行,思想都是一样的
题目描述(牛客)
山峰元素是指其值大于或等于左右相邻值的元素。
给定一个输入数组nums,任意两个相邻元素值不相等,数组可能包含多个山峰。
找到索引最大的那个山峰元素并返回其索引。
假设 nums[-1] = nums[n] = -∞。
https://www.nowcoder.com/practice/1af528f68adc4c20bf5d1456eddb080a?tpId=196&tqId=37165&rp=1&ru=%2Fta%2Fjob-code-total&qru=%2Fta%2Fjob-code-total%2Fquestion-ranking&tab=answerKey
本题所求的是山峰元素中索引最大的那个索引,所以逆序向前找会更快找到。
再进一步分析:
1、若a[n-1]>a[n-2],即最后一个元素就是山峰元素,此时最大索引就是n-1;
2、若a[n-1]<a[n-2],即倒数第二个元素可能是山峰元素,此时,继续比较a[n-2]与a[n-3]的大小即可找出山峰元素或者可能的山峰元素;
综上所述,找山峰元素时,只需当前元素与它之前的元素两两比较,就可以确定它是山峰元素或者它之前的元素可能是山峰元素,而无需判断当前元素比它前后的元素都大。
也就是说,我们的判断逻辑是:从最后一个元素开始,若它之前的元素小于它,则他就是一个山峰元素,且它的索引是我们所求的索引;反之,它之前的元素可能是山峰元素,在判断它之前的元素是否小于它,小于则它是山峰元素。
a[n-2]为可能的山峰元素
代码分析
/**
* 寻找最后的山峰
* @param a int整型一维数组
* @param aLen int a数组长度
* @return int整型
*/
int solve(int* a, int aLen ) {
// write code here
int i = aLen-1;
for(; ;i--)
{
if(a[i-1] < a[i])
break;
}
return i;
}
题目描述(leetcode)
代码
int findPeakElement(int* nums, int numsSize){
int i = 0;
for(; i< numsSize-1; i++)
{
if(nums[i] > nums[i+1])
return i;
}
return i;
}