Go from two sides of the array and check simultaneously whether there is a peak element. I add a condition like 3,2,1,3,2,1, after I checked number 2, I don't need to check number 1 because it will not be a peak.
class Solution {
public:
int findPeakElement(vector<int>& nums) {
if(nums.size()==1)
return 0;
if(nums[0]>nums[1])
return 0;
if(nums[nums.size()-1]>nums[nums.size()-2])
return nums.size()-1;
int l=1,r=nums.size()-2;
while(r>=l)
{
if(nums[l]>nums[l-1]&&nums[l]>nums[l+1])
return l;
if(nums[r]>nums[r-1]&&nums[r]>nums[r+1])
return r;
if(nums[l]>nums[l+1])
l+=2;
else
l++;
if(nums[r]>nums[r-1])
r-=2;
else
r--;
}
}
};