示例 2:
输入: nums = [1,2,1,3,5,6,4] 输出: 1 或 5 解释: 你的函数可以返回索引 1,其峰值元素为 2; 或者返回索引 5, 其峰值元素为 6。
说明:
你的解法应该是 O(logN) 时间复杂度的。
二分法:
如果中间的是峰值直接返回,如果不是,那么两边较大的那一侧是存在峰值的。
class Solution {
public:
int findPeakElement(vector<int>& nums)
{
int len = nums.size();
if(len == 1)
return 0;
int low = 0;
int high = len - 1;
while(low <= high)
{
int mid = (low + high) / 2;
if(mid == 0 || mid == len - 1)
{
if(mid == 0)
{
if(nums[mid] > nums[mid + 1])
return mid;
else
low = mid + 1;
}
else if(mid == len - 1)
{
if(nums[mid] > nums[mid - 1])
return mid;
else
high = mid - 1;
}
}
else if(nums[mid] > nums[mid - 1] && nums[mid] > nums[mid + 1])
{
return mid;
}
else
{
if(nums[mid - 1] > nums[mid + 1])
{
high = mid - 1;
}
else
{
low = mid + 1;
}
}
}
return -1;
}
};