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
之后一定存在峰值元素
-
添加两个虚拟左右端点,二分查找
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;elsei = mid+1;}return mid-1;//原数组移动了一位}
};