这是算法导论讲稿上的一道习题,个人觉得挺好~
问题描述:如果数组A[1……n]中的元素先递增后递减,则称数组为单峰的。更精确地描述是,存在m>=1&&m<=n:
(1) A[i]<A[i+1] (1<i<m)
(2) A[i]>A[i+1] (m<=i<n)
很显然,A[m]是这个数组中的最大值,A[m-1]<A[m]<A[m+1],现在要求给出一个O(lgn)的算法,来求出A[m]的值。
思路: 要求算法是O(lgn),可以考虑二分查找的框架。
对于相邻的两个元素,存在两情况A[i]<A[i+1]或者A[i]>A[i+1]。
利用这两种情况对子问题进行划分:
(1).A[i]<A[i+1] 则 m>i;
(2).A[i]>A[i+1] 则 m<=i;
二分法呼之欲出有木有!
public class UnimodalSearch {
/**
* @param args
*/
static int uniSearch(int[] a)
{
int left=0,right=a.length-1;
while(left<right)
{
int mid=(left+right)/2;
if(a[mid]<a[mid+1])
{
left=mid+1;
}
else if(a[mid]>a[mid+1])
{
right=mid;
}
}
return a[left];
}
public static void main(String[] args) {
int a[]=new int[]{1,3,4,7,8,6,5};
int ans=uniSearch(a);
System.out.println(ans);
}
}