假设:

上坡,一直往右边找,一定会找到一个 递减的数, 因为 nums[n] = 负无穷

下坡也是一样

上坡有2种情况

要么一直递增知道 nums[n], 要么 当 i< n的时候,就找到1个 数比前面的数要小。

class Solution {
public:
  /**
   * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
   *
   *
   * @param nums int整型vector
   * @return int整型
   */
  int findPeakElement(vector<int> &nums) {
    // write code here
    int n = nums.size();
    if (n == 0)
      return -1;
    if (n == 1)
      return 0;
    int l = 0, r = n - 1;
    while (l < r) {
      int m = l + (r - l) / 2;
      if (nums[m] < nums[m + 1]) {
        // 上坡,一直往右边找,一定会找到一个 递减的数, 因为 nums[n] = 负无穷
        l = m + 1;
      } else {
        r = m;
      }
    }
    return l;
  }
  int checkx(vector<int> &nums) {
    int n = nums.size();
    if (n <= 0)
      return -1;
    if (n == 1)
      return 0;
    int l = INT_MIN, r = INT_MIN;
    if (nums[0] >= l && nums[0] >= nums[1])
      return 0;
    if (nums[n - 1] >= r && nums[n - 2] <= nums[n - 1])
      return n - 1;
    return -1;
  }
};

#ifdef debug

int main() {
  cout << __FILE__ << endl;
  Solution k;
  vector<int> nums{1, 2, 3, 4, 5, 6, 7, 8, 9};
  println(k.findPeakElement(nums));
  return 0;
}

#endif