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; } }