https://leetcode.com/problems/find-peak-element/

1. Use linear search:

  1. //4 ms 6.4 MB
  2. class Solution {
  3. public:
  4. int findPeakElement(vector<int>& nums) {
  5. for(int i = 0; i < nums.size() - 1; i++){
  6. if(nums[i] > nums[i + 1])
  7. return i;
  8. }
  9. return nums.size() - 1;
  10. }
  11. };

2. Use binary search:

//8 ms    9 MB

class Solution {
public:
    int findPeakElement(vector<int>& nums) {
        if(nums.size() == 1)
            return 0;

        int peak;
        peak = findPeak(nums, 0, nums.size()-1);

        return peak;
    }

private:
    int findPeak(vector<int>& nums, int l, int r) {
        if(l>r)
            return -1;

        int m = l + (r-l) / 2;

        if(m > 0 && m < nums.size() - 1){
            if((nums[m-1] < nums[m]) && (nums[m+1] < nums[m])){
                return m;
            }
        }
        else if(m == 0){
            if(nums[m+1] < nums[m]){
                return m;
            }
        }
        else if(m == nums.size() - 1){
            if(nums[m-1] < nums[m]){
                return m;
            }
        }


        return max(findPeak(nums, l, m-1), findPeak(nums, m+1, r));
    }
};

OR

//4 ms    6.6 MB

class Solution {
public:
    int findPeakElement(vector<int>& nums) {
        int l = 0, r = nums.size() - 1;

        while(l < r){
            int median = l + (r - l) / 2;

            if(nums[median] > nums[median + 1])
                r = median;
            else
                l = median + 1;
        }

        return l;
    }
};