题解 | 寻找峰值
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param nums int整型一维数组
* @return int整型
[1]
[1,2]
[2,1]
[1,2,3]
[2,4,1,2,7,8,4]
[1,3,2]
[3,1,2]
*/
public int findPeakElement (int[] nums) {
if (nums.length == 0) {
return -1;
}
if (nums.length == 1) {
return 0;
}
int start = 0;
int end = nums.length;
while (start <= end) {
int mid = start + (end - start) / 2;
if (mid == 0) {
if (nums[0] > nums[1]) {
return 0;
} else {
start = mid+1;
continue;
}
}
if (mid == nums.length -1) {
if (nums[mid] > nums[mid -1]) {
return mid;
} else {
end = mid-1;
continue;
}
}
if (nums[mid] > nums[mid - 1] && nums[mid] > nums[mid + 1]) {
return mid;
} else if (nums[mid] < nums[mid - 1]) {
end = mid - 1;
} else if (nums[mid] < nums[mid + 1]) {
start = mid + 1;
}
}
return -1;
}
}
知识点:
- 看到logN就想到二分查找法,切记!!!
再看看题目的提示,nums【i】 != nums【i+1】,另外就是还有个条件,你循环的时候你会发现,如果num【i】> nums[i-1],那么nums[i]很可能就是峰值,除非他是单调递增的 nums[i+1] > nums[i],且nums[i+2] > nums[i+1]一直增加上去,一直遇到第一个小的就结束了。
这么想想,用二分查找去做久自然能想通了,如果mid比左边的大,说明峰值在右边,如果mid比右边的大,说明峰值在左边。
比较难搞的是边界条件很难写,mid-1可能搞成负值。mid+1也可能越界,因此单独提出来。
查看1道真题和解析

