public class Solution { public int findPeakElement1(int[] nums) { if (nums == null || nums.length == 0) return -1; if (nums.length == 1) return 0; int N = nums.length; for (int i = 1; i < N - 1; i++) { if (nums[i] > nums[i - 1] && nums[i] > nums[i + 1]) return i; } if (nums[0] > nums[1]) return 0; else if (nums[N - 1] > nums[N - 2]) return N - 1; else return -1; } public int findPeakElement(int[] nums) { if (nums == null || nums.length == 0) return -1; if (nums.length == 1 || nums[0] > nums[1]) return 0; int N = nums.length; int left = 0, right = N - 1; while (right >= left) { if (left == right) return left; int mid = left + (right - left) / 2; if (nums[mid] < nums[mid + 1]) left = mid + 1; else if (nums[mid] < nums[mid - 1]) right = mid - 1; else return mid; } return -1; } }
Leetcode - Find Peak Element
[分析] 暴力法,按序扫描数组,找到peak element。提示说复杂度可以是logN级别的,那就要二分查找了,如何进行二分呢?考察nums[mid]和其左右相邻元素:若nums[mid] < nums[mid + 1], 则右侧必存在一个局部最大值,简略证明:若右侧一直是升序,则最后一个元素是peak element, 否则,第一次升序的波峰处是一个peak element。同理,若num[mid] < nums[mid - 1], 则左侧必存在一个局部最大值。若前面两种情况都不成立,则mid处就是一个局部最大值。
猜你喜欢
转载自likesky3.iteye.com/blog/2233880
今日推荐
周排行