import java.util.*;
//方法一:暴力解法,一次遍历。时间复杂度:O(N)
//方法二:二分法,或者是分治法,时间复杂度为:O(lonN)
public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型一维数组 
     * @return int整型
     */
    public int findPeakElement (int[] nums) {
        // write code here
//         //方法一:暴力解法,一次遍历。时间复杂度:O(N)
//         int length =  nums.length;
//         //特殊值处理,只有一个元素时
//         if(length == 1){
//             return 0;
//         }
//         //第一个元素
//         if(nums[0]>nums[1]){
//             return 0;
//         }
//         //最后一个元素
//         if(nums[length-1]>nums[length-2]){
//             return length-1;
//         }
//         //第二个元素到倒数第二个元素
//         for(int i=1;i<length-1;i++){
//             if(nums[i]>nums[i-1] && nums[i]>nums[i+1]){
//                 return i;
//             }
//         }
        
//         return 0;
        
        //方法二:二分法,或者是分治法,时间复杂度为:O(lonN)
        
        int length = nums.length;
        //特殊值处理
        if(length == 1){
            return 0;
        }
        //第一个元素
        if(nums[0]>nums[1]){
            return 0;
        }
        //最后一个元素
        if(nums[length-1]>nums[length-2]){
            return length-1;
        }
        int min = 1;//最小值索引
        int max = length-2;//最大值索引
        int mid = (min+max)/2;//中值索引
        int res = peek(min,max,mid,nums);
        
        return res;
    }
    
    public int peek(int min,int max,int mid,int[] nums){
        if(min>max){//递归出口
            return -1;
        }
        if(nums[mid]>nums[mid-1] && nums[mid]>nums[mid+1]){//符合题目条件,返回结果
            return mid;
        }else{
            int max1 = mid-1;//更新最大值
            int temp = peek(min,max1,(min+max1)/2,nums);//左递归
            if(temp != -1){
                return temp;
            }
            int min1 = mid+1;//更新最小值
            temp = peek(min1,max,(mid+1+max)/2,nums);//右递归
            if(temp !=-1 ){
                return temp;
            }
        }
        return -1;
    }
}