寻找峰值

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 }
View Code
原文地址:https://www.cnblogs.com/ddcckkk/p/6806297.html