算法导论——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);
	}

}

     

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值