LeetCode 162. 寻找峰值(二分查找)

1. 题目

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

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

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

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/find-peak-element
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 二分查找

题目假设nums[-1]=nums[n]=-∞

  • 如果nums[i] > nums[i+1],则在i之前一定存在峰值元素

  • 如果nums[i] < nums[i+1],则在i+1之后一定存在峰值元素
    LeetCode 162. 寻找峰值(二分查找)_第1张图片

  • 添加两个虚拟左右端点,二分查找

class Solution {
public:
    int findPeakElement(vector<int>& nums) {
        nums.push_back(INT_MIN);
        reverse(nums.begin(), nums.end());
        nums.push_back(INT_MIN);
        reverse(nums.begin(), nums.end());
        int i = 1, j = nums.size()-2, mid;
        while(i <= j)
        {
        	mid = i+((j-i)>>1);
        	if(nums[mid-1] < nums[mid] && nums[mid] > nums[mid+1])
        		return mid-1;//原数组移动了一位
        	if(nums[mid] > nums[mid+1])
        		j = mid-1;
        	else
        		i = mid+1;
        }
        return mid-1;//原数组移动了一位
    }
};

LeetCode 162. 寻找峰值(二分查找)_第2张图片

你可能感兴趣的:(LeetCode)