285,寻找峰值

峰值元素是指其值大于左右相邻值的元素。

给定一个输入数组 nums,其中 nums[i] ≠ nums[i+1],找到峰值元素并返回其索引。

数组可能包含多个峰值,在这种情况下,返回任何一个峰值所在位置即可。

你可以假设 nums[-1] = nums[n] = -∞。

示例 1:

输入: nums = [1,2,3,1]
输出: 2
解释: 3 是峰值元素,你的函数应该返回其索引 2。

示例 2:

输入: nums = [1,2,1,3,5,6,4]
输出: 1 或 5 
解释: 你的函数可以返回索引 1,其峰值元素为 2;     或者返回索引 5, 其峰值元素为 6。

答案:

1public int findPeakElement(int[] nums) {
2    for (int i = 1; i < nums.length; i++) {
3        if (nums[i] < nums[i - 1]) {
4            return i - 1;
5        }
6    }
7    return nums.length - 1;
8}

解析:

代码很容易理解,如果当前值比前一个大,则继续寻找下一个,直到下一个比它小的为止,因为前一个是比他小的,当后一个再比它小的时候,他就是峰值。我们还可以通过二分法的方式来查找

 1public int findPeakElement(int[] nums) {
2    int low = 0;
3    int high = nums.length - 1;
4    while (low < high) {
5        int mid1 = (low + high) / 2;
6        int mid2 = mid1 + 1;
7        if (nums[mid1] < nums[mid2])
8            low = mid2;
9        else
10            high = mid1;
11    }
12    return low;
13}

这个如果能看懂,也算是半个高手了,每次比较的时候都是拿中间的值和中间的下一个值进行比较,然后再缩小查找数组的范围,每次缩小的结果是要么high比它右边的大,要么low比它左边的大,直到low等于high的时候,我们可以说low比它左边相邻的大,并且比它右边相邻的也大。或者我们也可以使用递归的方式

 1public int findPeakElement(int[] nums) {
2    return Helper(nums, 0, nums.length - 1);
3}
4
5int Helper(int[] nums, int low, int high) {
6    if (low == high)
7        return low;
8    int mid1 = (low + high) / 2;
9    int mid2 = mid1 + 1;
10    if (nums[mid1] > nums[mid2])
11        return Helper(nums, low, mid1);
12    else
13        return Helper(nums, mid2, high);
14}
上一篇:php7.3源码编译


下一篇:4. 寻找两个正序数组的中位数