题目:
峰值元素是指其值严格大于左右相邻值的元素。给你一个整数数组 nums,找到峰值元素并返回其索引。数组可能包含多个峰值,在这种情况下,返回 任何一个峰值 所在位置即可。你可以假设 nums[-1] = nums[n] = -∞ 。你必须实现时间复杂度为 O(log n) 的算法来解决此问题。
思想:
查询方法采用二分查找,每次查找到mid用mid与临近两个下标数组元素进行比较,如果发现大于两边则返回下标,如果发现小于mid-1那么说明mid-1是大于mid的,我们将区间缩小到mid左边,令右边界为mid-1,反之亦然,如果发现两边都大于mid那么哪边都可以进行讨论,但只能在mid一边讨论。如果有多个峰值也是适用的,细节处理起来较为麻烦,需要注意索引越界,控制边界。
代码展示:
class Solution {
public int findPeakElement(int[] nums) {
int length = nums.length;
int l = 0;
int r = length - 1;
int mid = l;
if(length == 1){
return 0;
}
if(length == 2){
if(nums[0]<nums[1]){
return 1;
}
}
else{
while(l<=r){
mid = (l+r)/2;
if(mid == 0){
if(nums[mid]>nums[mid + 1]){
return mid;
}else{
l = l + 1;
}
}
if(mid == length - 1){
if(nums[mid]>nums[mid - 1]){
return mid;
}else{
r = r - 1;
}
}
mid = (l+r)/2;
if(nums[mid]>nums[mid-1] && nums[mid]>nums[mid+1]){
return mid;
}
if(nums[mid]<nums[mid+1]){
l = mid + 1;
}else{
r = mid - 1;
}
}
}
return mid;
}
}