//O(n),遍历
int findPeakElement1(vector<int>& nums)
{
const size_t length = nums.size() - 1;
if (length == 0) return 0;
if (nums[0] > nums[1])
return 0;
if (nums[length] > nums[length - 1])
return length;
for (size_t i = 1; i < length; i++)
{
if (nums[i] > nums[i - 1] && nums[i] > nums[i + 1])
{
return i;
}
}
return 0;
}
//O(n),哨兵遍历
int findPeakElement2(vector<int>& nums)
{
nums.push_back(0x80000000);
for (size_t i = 0; i < nums.size(); i++)
{
if (nums[i] > nums[i + 1])
{
return i;
}
}
return 0;
}
//O(logn),二分
int findPeakElement(vector<int>& nums)
{
int len = nums.size() - 1;
int left = 0;
int right = len;
int mid;
while (left < right)
{
mid = left + ((right - left) >> 1);//>>1是除2的意思
if (nums[left] > nums[right])//判断向左,向右那边比较高
{
//判断当前位于正在上坡还是下坡
if (nums[mid] > nums[left] && !(mid > 0 && nums[mid] < nums[mid - 1]))
{
left = mid;
}
else
{
right = mid - 1;
}
}
else
{
//判断当前位于正在上坡还是下坡
if (nums[mid] > nums[right] && !(mid < len && nums[mid] < nums[mid + 1]))
{
right = mid;
}
else
{
left = mid + 1;
}
}
}
return nums[left] > nums[right] ? left : right;
}