描述

给定一个长度为n的数组nums,请你找到峰值并返回其索引。数组可能包含多个峰值,在这种情况下,返回任何一个所在位置即可。

1.峰值元素是指其值严格大于左右相邻值的元素。严格大于即不能有等于

2.假设 nums[-1] = nums[n] = -\infty−∞

3.对于所有有效的 i 都有 nums[i] != nums[i + 1]

4.你可以使用O(logN)的时间复杂度实现此问题吗?

数据范围:

1 \le nums.length \le 2\times 10^5 \1≤nums.length≤2×105 

-2^{31}<= nums[i] <= 2^{31} - 1−231<=nums[i]<=231−

如输入[2,4,1,2,7,8,4]时,会形成两个山峰,一个是索引为1,峰值为4的山峰,另一个是索引为5,峰值为8的山峰,如下图所示:

【无标题】剑指offer——寻找峰值-LMLPHP

输入:[2,4,1,2,7,8,4]

返回值:1

说明:4和8都是峰值元素,返回4的索引1或者8的索引5都可以

示例2

输入:[1,2,3,1]
返回值:2

说明:3 是峰值元素,返回其索引 2

思路一:因为nums[-1]和nums[n]都为负无穷,所有获取一个最大值肯定是波峰,但是时间复杂度是O(n)。

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param nums int整型一维数组
     * @return int整型
     */
    public int findPeakElement (int[] nums) {
        // write code here
        int temp = 0;
        for(int i =1;i<nums.length;i++){
            if(nums[i] > nums[temp]){
                temp = i;
            }
        }
        return temp;
    }
}

思路二:上坡一定有波峰,下坡不一定有波峰,时间复杂度O(logn)

【无标题】剑指offer——寻找峰值-LMLPHP

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param nums int整型一维数组
     * @return int整型
     */
    public int findPeakElement (int[] nums) {
        // write code here
        int left = 0;
        int right = nums.length - 1;
        while(left < right){
            int mid = (left + right)/2;
            if(nums[mid] < nums[mid + 1]){
                left = mid + 1;
            }else{
                right = mid;
            }
        }
        return left;
    }
}
06-26 10:22