BM19 寻找峰值
给定一个长度为n的数组nums,请你找到峰值并返回其索引。数组可能包含多个峰值,在这种情况下,返回任何一个所在位置即可。
1.峰值元素是指其值严格大于左右相邻值的元素。严格大于即不能有等于
2.假设 nums[-1] = nums[n] = -\infty−∞
3.对于所有有效的 i 都有 nums[i] != nums[i + 1]
4.你可以使用O(logN)的时间复杂度实现此问题吗?
解法
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param nums int整型一维数组
* @param numsLen int nums数组长度
* @return int整型
*/
static int find_k(int* nums, int minx)
{
if(nums[0]>nums[1])return 0;
if(nums[minx]>nums[minx-1])return minx;
int mid = minx/2;
int le = 1;
int ri = minx-1;
while(le<=ri)
{
if(ri==le)return le;
if(ri==le+1)return nums[le]>nums[ri]?le:ri;
if(nums[mid]<nums[mid-1])
{
ri = mid-1 ;
}else if(nums[mid]<nums[mid+1])
{
le = mid+1;
}else{
return mid;
}
mid = (le+ri)>>1;
}
return -1;
}
int findPeakElement(int* nums, int numsLen ) {
// write code here
if(!nums||numsLen<=0)return -1;
int res = -1;
switch (numsLen)
{
case 1:
res = 0;
break;
case 2:
res = nums[0]>nums[1]?0:1;
break;
default:
res = find_k(nums , numsLen - 1);
break;
}
return res;
}