题目

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

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

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

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

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

题解

本题采用二分查找法进行求解,进行nums[i] < nums[i+1] 判断,如果小于后一个数,那么峰值一定在i后面,否则在前面。这里等于没有特别判断,位于左右侧都可以。需要注意的是这里引用了nums[i+1],就需要对访问范围进行限制,防止越界,本题处理方法是right=nums.length - 1。

class Solution {
    public int findPeakElement(int[] nums) {
        int left = 0;
        int right = nums.length - 1;
        while(left < right){
            int mid = left + (right - left) / 2;
            if(nums[mid] < nums[mid + 1]){
                left = mid + 1;
            }
            else{
                right = mid;
            }
        }
        return left;
    }
}
01-08 23:25