75.Find Peak Element
Last updated
Last updated
public int findPeak(int[] A){
if(A==null || A.length==0){
return -1;
}
//caution: start and end;
int start=1;
int end=A.length-2;
while(start+1<end){
int mid=start+(end-start)/2;
//top directly return
if(position(A,mid)==2){
return mid;
}
//increase
else if(position(A,mid)==1){
start=mid;
}
//decrease
else if(position(A,mid)==-1){
end=mid;
}
//bottom
else if(position(A,mid)==-2){
start=mid; //or end =mid;
}
}
if(position(A,start)==2){
return start;
}
if(position(A,end)==2){
return end;
}
return -1;
}
public int position(int[] A,int mid){
int middle=A[mid];
int pre=A[mid-1];
int post=A[mid+1];
//bottom
if(middle<pre && middle<post){
return -2;
}
//decrease
else if(middle<pre && middle>post){
return -1;
}
//top
else if(middle>pre && middle>post){
return 2;
}
//increase
else if(middle>pre && middle<post){
return 1;
}
return 0;
}