http://www.lintcode.com/zh-cn/problem/find-peak-element/
注意点:以mid的位置为分类条件,波峰,上升下降,波谷,从而不会遗漏什么情况。
设置区间长度为3比较好
1 public int findPeak(int[] A) { 2 if(A == null || A.length == 0) return -1; 3 int start = 0, end = A.length - 1; 4 //先找左上升区间,再找右下降区间,不可行,设置区间长度为3试试 5 while(end - start > 1) { 6 int mid = start + (end - start) / 2; 7 if(A[mid] > A[mid -1] && A[mid] > A[mid + 1]) return mid; 8 if(A[mid] > A[mid -1])`{ 9 start = mid; 10 } else { 11 end = mid; 12 } 13 } 14 //其实可能数组越界的,所以还是区间长度为3靠谱,也可以判断下start -1, end+ 1是否越界, 15 //不越界就判断下面if,否则少一个判断条件 16 17 if(A[start] > A[start -1] && A[start] > A[end]) return start; 18 if(A[end] > A[start] && A[end] > A[end + 1]) return end; 19 20 } 21 public int findPeak(int[] A) { 22 if (A ==null || A.length == 0) { 23 return -1; 24 } 25 int start = 0; int end = A.length - 1; int mid; 26 while (end - start > 2) { 27 mid = start + (end - start) / 2; 28 if(A[mid] > A[mid -1] && A[mid] > A[mid + 1]) { //mid是波峰 29 return mid; 30 } else if(A[mid] > A[mid -1] && A[mid] < A[mid + 1]) { //mid是上升沿 31 start = mid; 32 } else { //mid是下降沿或者波谷 33 end = mid; 34 } 35 } 36 mid = start + (end - start) / 2; 37 if (A[mid] > A[start] && A[mid] > A[end]) { 38 return mid; 39 } else { 40 return -1; 41 } 42 }