Find Peak Element
本质上都是half half
public int findPeak(int[] A) {
// write your code here
if (A == null || A.length == 0) {
return -1;
}
int start = 1;
//并不需要是A.length - 2,因为mid进去的条件是array的元素 > 2个,而mid进去的话肯定不在边上,即肯定不是A.length - 1(三个元素的话肯定在中间,所以并不存在数组越界的问题)
int end = A.length - 1;
while (start + 1 < end) {
int mid = start + (end - start) / 2;
//第2,3种情况可以合并
if (A[mid] > A[mid - 1] && A[mid + 1] > A[mid]) {
start = mid;
} else if (A[mid - 1] > A[mid] && A[mid] > A[mid + 1]) {
end = mid;
} else if(A[mid - 1] > A[mid] && A[mid + 1] > A[mid]) {
//下面两个end, start怎么安排都行
start = mid;
} else {
//return mid也可以 因为就是peak
start = mid;//这个条件是峰/谷,反正左边右边都有peak
}
}
//narrow到2个元素。。。。OR一个元素,所以这里必须要包含==的情况
if (A[start] > A[end]) {
return start;
} else {
return end;
}
}
以下是leetcode的版本,leetcode允许纯升序or纯降序or一个元素
这个看起来更简洁呢
public int findPeakElement(int[] nums) {
if (nums == null || nums.length == 0) {
return -1;
}
int start = 0;
int end = nums.length - 1;
while (start + 1 < end) {
int mid = start + (end - start) / 2;
if (nums[mid - 1] < nums[mid]) {
start = mid;
} else {
end = mid;
}
}
//两个的情况
if (nums[end] > nums[start]) {
return end;
} else {//一个的情况,即nums[end] == nums[start]的情况
return start;
}
}