新手算法学习之路----二分法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; }