标签:
原题链接在这里:https://leetcode.com/problems/find-peak-element/
两种方法,第一种从头到尾遍历若是找到第一个变小的值,前面一个就是peak index, 若是一直变大,就是最后一个值为peak index. Time Complexity: O(n), Space O(1).
第二种方法是二分法,如何判断接下来应该找左边还是右边呢。依据其实是比较nums[m] 和 nums[m+1], 若是nums[m] > nums[m+1], peak 一定会出现在mid 左边,包括mid.
反之peak 就会出现在mid 右边, 不包括mid. corner case, 是只有一个值,此时l == r, 直接返回l 就好。
AC Java:
1 public class Solution { 2 public int findPeakElement(int[] nums) { 3 /* 4 //Method 1 5 for(int i = 1; i<nums.length; i++){ 6 if(nums[i] < nums[i-1]){ 7 return i-1; 8 } 9 } 10 return nums.length-1; 11 */ 12 //Method 2 13 int l = 0; 14 int r = nums.length-1; 15 while(l<=r){ 16 if(l == r){ 17 return l; 18 } 19 int m = l+(r-l)/2; 20 if(nums[m] > nums[m+1]){ 21 r = m; 22 }else{ 23 l = m+1; 24 } 25 } 26 return l; 27 } 28 }
标签:
原文地址:http://www.cnblogs.com/Dylan-Java-NYC/p/4877146.html