题目描述:
峰值元素是指其值大于左右相邻值的元素。
给定一个输入数组 nums
,其中 nums[i] ≠ nums[i+1]
,找到峰值元素并返回其索引。
数组可能包含多个峰值,在这种情况下,返回任何一个峰值所在位置即可。
你可以假设 nums[-1] = nums[n] = -∞
。
示例:
- 示例1:
输入: nums = [1,2,3,1]
输出: 2
解释: 3 是峰值元素,你的函数应该返回其索引 2。
- 示例2:
输入: nums = [1,2,1,3,5,6,4]
输出: 1 或 5
解释: 你的函数可以返回索引 1,其峰值元素为 2;
或者返回索引 5, 其峰值元素为 6。
解题思路:
- 思路一:
遍历整个数组(这个是我最擅长的一种方式也是最笨的方式,毕竟算法小菜鸟都不算o(╥﹏╥)o)。将特殊情况提取出来判定后再遍历数组寻找峰值。
- 思路二:
用二分法的方式来寻找峰值(这么牛的思路只能是借鉴了o(╥﹏╥)o)
AC代码1:
//遍历寻找峰值
int findPeakElement(int* nums, int numsSize) {
if(nums == NULL || numsSize == 0)//当数组为空的情况不存在峰值
{
return -1;
}
if(numsSize == 1 || nums[0] > nums[1])//当数组仅有1个值或者第一个值大于第二个值时数组的第一个值为峰值
{
return 0;
}
if(nums[numsSize - 2] < nums[numsSize - 1])//当数组中的最后一个大于数组中倒数第二个值时数组的最后一个值为峰值
{
return numsSize - 1;
}
for(int i = 1; i < numsSize - 1; i++)//不满足上述所有条件后遍历数组查找数组中的峰值
{
if(nums[i - 1] < nums[i] && nums[i] > nums[i + 1])
{
return i;
}
}
return -1;
}
AC代码2:
//二分法寻找峰值
int findPeakElement(int* nums, int numsSize) {
int i = 0;
int j = numsSize - 1;
while(i < j)
{
int temp = (i + j) / 2;
if(nums[temp] > nums[temp + 1])
{
j = temp;
}
else
{
i = temp + 1;
}
}
return i;
}