问题:
思路:
感谢前段时间的二分查找的练习,虽然这个不是排好序的,但是用二分法来解决还是很容易的。
主要分析mid,,如果mid位置上的值 大于两侧的,则满足条件
mid 与两侧的值还有另外其他的情况,举个栗子,mid-1 mid mid+1 位置上的值分别为
(1) 左 < 中 > 右 (mid 即为所求)
(2)左 < 中 < 右 (需要在mid - right 边查找)
(3)左 > 中 > 右 (需要在left - mid 边查找)
(4)左 > 中 < 右 (左右都可,代码中 与 第三种情况合并了,就是在left - mid边找)
代码:
class Solution {
public int findPeakElement(int[] nums) {
int left = 0;
int right = nums.length-1;
//如果数组长度为1,或者首位就直接满足条件
if(left==right){
return left;
}else if(nums[left]>nums[left+1]){
return left;
}else if(nums[right]>nums[right-1]){
return right;
}
right--;
left++;
while(left<=right){
int mid = left + (right-left)/2;
//mid-1 mid mid+1 的位置上,大致有这几种情况
// 1 2 3, 3 2 1, 1 3 2
if(nums[mid]>nums[mid-1]&& nums[mid]>nums[mid+1]){
return mid;
}else if(nums[mid]>nums[mid-1]&& nums[mid]<nums[mid+1]){
left = mid+1;
}else if(nums[mid]<nums[mid-1]){
right = mid-1;
}
}
return -1;
}
}