162. 寻找峰值
根据假设 nums[-1] = nums[n] = -∞ 。
那么假设nums[i]<nums[i+1]那么往右侧找一定能找到,因为右侧num[n]= -∞
同理如果nums[i] < nums[i-1] 那么往左找一定能找到,因为左侧num[-1]= -∞
public int findPeakElement(int[] nums) {
int len = nums.length;
if(len == 1){
return 0;
}
int l = 0,r = len-1;
int mid;
while(l<=r){
mid = (l+r)>>1;
//判断nums[0]是否满足
if(mid == 0){
if(nums[mid]>nums[mid+1]){
return mid;
}
l = mid+1;
continue;
}
//判断nums[n-1]是否满足
if(mid == len-1){
if(nums[mid]> nums[mid-1]){
return mid;
}
r = mid-1;
continue;
}
if(nums[mid]>nums[mid-1] ){
if( nums[mid]>nums[mid+1]){
return mid;
}
l = mid+1;
continue;
}
r = mid-1;
}
return -1;
}
第二版
public int findPeakElement(int[] nums) {
int len = nums.length;
if(len<=1){
return 0;
}
int l = 0, r = nums.length - 1;
int mid = 0;
while (l < r) {
mid = (r + l) >> 1;
// 因为l<r,mid = (l+r)/2 所以 mid <r ,mid+1 不会越界
if(nums[mid]>nums[mid+1]){
// 判断nums[0]是否满足
if(mid == 0){
return mid;
}
r = mid;
continue;
}
// 判断nums[len-1]是否满足
if(mid == len-2){
return len-1;
}
l = mid+1;
}
//出来的时候l=r,因此返回l 或者 r都可
return r;
}
版本三,不考虑效率
因为对于所有有效的 i 都有 nums[i] != nums[i + 1],那么最大值一定是峰值,因此寻找最大值
public int findPeakElement(int[] nums) {
int l = 0,r = nums.length-1;
int mid;
while(l<r){
mid = (l+r)>>1;
if(nums[mid]<nums[mid+1]){
l = mid+1;
continue;
}
r = mid;
}
return r;
}