题解 | 寻找峰值
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param nums int整型一维数组 * @return int整型 [1] [1,2] [2,1] [1,2,3] [2,4,1,2,7,8,4] [1,3,2] [3,1,2] */ public int findPeakElement (int[] nums) { if (nums.length == 0) { return -1; } if (nums.length == 1) { return 0; } int start = 0; int end = nums.length; while (start <= end) { int mid = start + (end - start) / 2; if (mid == 0) { if (nums[0] > nums[1]) { return 0; } else { start = mid+1; continue; } } if (mid == nums.length -1) { if (nums[mid] > nums[mid -1]) { return mid; } else { end = mid-1; continue; } } if (nums[mid] > nums[mid - 1] && nums[mid] > nums[mid + 1]) { return mid; } else if (nums[mid] < nums[mid - 1]) { end = mid - 1; } else if (nums[mid] < nums[mid + 1]) { start = mid + 1; } } return -1; } }
知识点:
- 看到logN就想到二分查找法,切记!!!
再看看题目的提示,nums【i】 != nums【i+1】,另外就是还有个条件,你循环的时候你会发现,如果num【i】> nums[i-1],那么nums[i]很可能就是峰值,除非他是单调递增的 nums[i+1] > nums[i],且nums[i+2] > nums[i+1]一直增加上去,一直遇到第一个小的就结束了。
这么想想,用二分查找去做久自然能想通了,如果mid比左边的大,说明峰值在右边,如果mid比右边的大,说明峰值在左边。
比较难搞的是边界条件很难写,mid-1可能搞成负值。mid+1也可能越界,因此单独提出来。