原地址:https://www.jianshu.com/p/d4ba7f4d7f46
A peak element is an element that is greater than its neighbors.
For example, in array [1, 2, 3, 1], 3 is a peak element and your function should return the index number 2.
找到数组中的峰点,即这个数大于左右两边的数,示例代码如下。
public static void main(String[] args) throws SchedulerException {
MainTest test = new MainTest();
int arr[] = { 1, 3, 20, 4, 1, 0 };
int n = arr.length;
System.out.printf("Index of a peak point is %d", test.findPeak(arr, n));
}
// A binary search based function that returns index of a peak element
int findPeakUtil(int arr[], int low, int high, int n) {
// 取得数组中间的 index
// Find index of middle element
int mid = low + (high - low) / 2; /* (low + high)/2 */
// 如果当前元素mid比左边的mid-1大,也比右边的mid+1大,那么mid就是答案。
// Compare middle element with its neighbours (if neighbours exist)
if ((mid == 0 || arr[mid - 1] <= arr[mid]) && (mid == n - 1 || arr[mid + 1] <= arr[mid]))
return mid;
// 如果左边的mid-1比当前元素mid大 则继续向左边取值
// If middle element is not peak and its left neighbor is greater than
// it
// then left half must have a peak element
else if (mid > 0 && arr[mid - 1] > arr[mid])
return findPeakUtil(arr, low, (mid - 1), n);
// If middle element is not peak and its right neighbor is greater than
// it
// then right half must have a peak element
else
return findPeakUtil(arr, (mid + 1), high, n);
}
// A wrapper over recursive function findPeakUtil()
int findPeak(int arr[], int n) {
return findPeakUtil(arr, 0, n - 1, n);
}