leetcode刷题
162. 寻找峰值
题目
峰值元素是指其值严格大于左右相邻值的元素。
给你一个整数数组 nums,找到峰值元素并返回其索引。数组可能包含多个峰值,在这种情况下,返回 任何一个峰值 所在位置即可。
你可以假设 nums[-1] = nums[n] = -∞ 。
你必须实现时间复杂度为 O(log n) 的算法来解决此问题。
nums[i] != nums[i + 1]
分析
本文的问题是找到任何一个峰值即可。所以使用二分法需要判断哪部分区域存在峰值。
对于nums[mid],存在两种可能
-
mid为峰值点,直接返回即可
-
mid不为峰值点,即两侧一个大于nums[mid],一个小于nums[mid]
针对于上升的一侧,如果往上升方向一直升序,则终点为峰值;如果出现第一个降序的转折点,则那个点为峰值点
所以mid上升方向一定会存在峰值点
代码
public int findPeakElement(int[] nums) {
if (nums.length==1)
return 0;
if (nums.length==2){
return nums[1]>nums[0] ? 1 : 0;
}
int left=0;
int right = nums.length-1;
int mid;
while(left<=right){
mid = (left + right) / 2;
if ((mid==0 && nums[mid]>nums[mid+1]) || (mid==nums.length-1 && nums[mid]>nums[nums.length-2]) || ( mid>0 && mid<nums.length-1 && nums[mid]>nums[mid-1] && nums[mid]>nums[mid+1])){
return mid;
}
else if (nums[mid+1]>nums[mid]){
left = mid+1;
}
else{
right = mid-1;
}
}
return -1;
}
结果
时间超过100.00%
内存超过81.78%