新手算法学习之路----二分法Find-Peak-Element

题目:

你给出一个整数数组(size为n),其具有以下特点:

  • 相邻位置的数字是不同的
  • A[0] < A[1] 并且 A[n - 2] > A[n - 1]

假定P是峰值的位置则满足A[P] > A[P-1]A[P] > A[P+1],返回数组中任意一个峰值的位置。

思路:

        中点mid大于左右相邻点,mid就为峰值,

        mid大于mid+1,小于mid-1 峰值在mid左边

        mid小于mid+1,大于mid-1峰值在mid的右边

        mid小于mid+1,也小于mid-1 峰值在两变,随便找一变就可以

Java代码:

 public int findPeak(int[] A) {
        // write your code here
        int start =0, end = A.length-1, mid;
        if(A==null||A.length==0) return -1;
        while(start+1<end){
            mid = start + (end - start)/2;
            if(A[mid]>A[mid+1]&&A[mid]>A[mid-1]){
                return mid;
            }else if(A[mid]>A[mid+1]&&A[mid]<A[mid-1]){   //峰值的mid的左边
                end= mid;
            }else if(A[mid]<A[mid+1]&&A[mid]>A[mid-1]){    //峰值在mid的右边
                start = mid;
            }else if(A[mid]<A[mid+1]&&A[mid]<A[mid-1]){    //说明mid为谷值可以往右也可以往左,但是可以将这一判断语句与上面的语句集成起来,我这边为了程序的可读性好一点。
                end = mid;
            }
        }
        if(A[start]<A[end]){
            return end;
        }else if(A[start]>A[end]){
            return end;
        }else return -1; 
    }

 

posted @ 2017-07-10 09:47  JunLiu37  阅读(338)  评论(0编辑  收藏  举报