import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param nums int整型一维数组
     * @return int整型
     */
    public int findPeakElement (int[] nums) {
        // write code here
        // 左程云老师讲过局部极值问题,采用二分思想解决

        // 算法的时间复杂度O(logN),额外空间复杂度O(1)

        // 1.先判断n=1和2的情况
        int n = nums.length;
        if (n == 1) {
            return 0;
        }
        if (n == 2) {
            return nums[0] > nums[1] ? 0 : 1;
        }

        // 2.采用二分思想,确定左右边界,分别考察边界的递增情况
        int l = 0;
        int r = n - 1;
        int mid = 0;
        while (l <= r) {
            mid = (l + r) / 2;
            // 2.1 若两边中有一边出现了极值,直接返回
            if (nums[l] > nums[l + 1]) {
                return l;
            }
            if (nums[r] > nums[r - 1]) {
                return r;
            }
            // 2.2 若两边均未出现极值,说明是[↗……↘] 的情况,则考察中间的mid
            if (nums[mid] > Math.max(nums[mid - 1], nums[mid + 1])) {
                // 若mid处的两边能确定极值,即[↗……↗↘……↘],则返回mid
                return mid;
            } else if (nums[mid - 1] > Math.max(nums[mid], nums[mid + 1])) {
                // 若mid-1处元素更大,即[↗……↖……↘],说明极值出现在左半区,修改右边界r
                r = mid - 1;
            } else {
                // 若mid+1处元素更大,即[↗……↗……↘],说明极值出现在右半区,修改左边界l
                l = mid + 1;
            }
        }
        
        // 3.直到退出了循环,还找不到峰值,则返回-1
        return -1;
    }
}