75.Find Peak Element
1.Description(Medium)
There is an integer array which has the following features:
The numbers in adjacent positions are different.
A[0] < A[1] && A[A.length - 2] > A[A.length - 1].
We define a position P is a peek if:
A[P] > A[P-1] & A[P] > A[P+1]
Find a peak element in this array. Return the index of the peak.
Notice
The array may contains multiple peeks, find any of them.
Example
Given[1, 2, 1, 3, 4, 5, 7, 6]
Return index1
(which is number 2) or6
(which is number 7)
Time complexity O(logN)
2.Code
以下只适用于lintcode,因为Lintcode的题目限制了A[0] < A[1] && A[A.length - 2] > A[A.length - 1].,所以可以start=1;end=length-2;
但是leetcode没有限制,所以词方法不行。
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;
}
Last updated
Was this helpful?