题解 | #寻找峰值#
寻找峰值
http://www.nowcoder.com/practice/fcf87540c4f347bcb4cf720b5b350c76
递归实现,代码简洁。
思路:
取中间值mid与其右边的值比较,如果比他小,那对与mid来说,距离他最近的峰值必定在其右侧区间;反之则在其左侧区间。
重复划分之后,最后数组中只剩下一个元素,那这个元素必定是其附近的一个峰值。
可以逆着想象一下,是如何到达只剩下一个元素的,假如前一步是剩下2个元素的数组,那一定是大的那个元素留下了。
再往前推一步,假如是4个元素的数组,比较的是中间两个元素,剩下的是大的元素所在区间。
比如数组[1,2,3,4],第一次比较2和3,进入[3,4];再次比较后进入[4]。
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param nums int整型一维数组
* @return int整型
*/
public int findPeakElement(int[] nums) {
if (nums == null) {
return -1;
}
return binaryFindPeakElement(nums, 0, nums.length - 1);
}
/**
* @param nums 数组
* @param left 左边界
* @param right 有边界
* @return 数组中的某一个峰值
*/
private static int binaryFindPeakElement(int[] nums, int left, int right) {
if (left == right) {
return left;
}
int mid = (left + right) / 2;
return nums[mid] < nums[mid + 1] ? binaryFindPeakElement(nums, mid + 1, right) : binaryFindPeakElement(nums, left, mid);
}
}