算法导论——Unimodal Search

            这是算法导论讲稿上的一道习题,个人觉得挺好~

          问题描述:如果数组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);
	}

}

     

你可能感兴趣的:(算法导论——Unimodal Search)