数组极小值的求解

给定一个整数数组,数组中元素都不相同,我们定义局部极小值,如果一个值小于或者等于左边相信的值 ,并且小于或者等于右边值,则该元素是数组。求它的一个局部最小值,要求算法时间复杂度为O(lgn)。
 

分析:
     由分析可知数组中的最小值一定是其中的一个极小值,而由我们原来常规的求最小值的访求,比较交换法时间复杂度为O(n),不满足要求,所以,需要思考是否可以求一个最小值,时间复杂度为O(lgn)。利用二分法刚好,可以实现。
   每次将数组切为两部分:
       左边:a1,a2,...,amin,求出左边最小值minValueOfLeft
       右边:amid+1,...,alength,求出左边最小值minValueOfRigth
        返回min{minValueOfLeft,minValueOfRigth}整个数组的最小值可以作为一个极小值

Java伪代码:   

 

int getLocalMinValue(int[] a,int begin,int end){

        if(begin==end) return a[begin];
        int mid=(begin+end)/2;
        if(a[min]<a[mid+1]) {
              minValueOfLeft=getLocalMinValue(a,begin,mid);
          }
        else if(a[min]>a[mid+1]) {
              minValueOfLeft=getLocalMinValue(a,mid+1,end);
          }
     return min{minValueOfLeft,minValueOfRigth};

}

算法分析:T(n)=T(n/2)+T(n/2)+O(1);
由算法分析相关基础知识,这种递归方程是时间复杂度为O(lgn)。
证明过程省略。如有必要,请联系我QQ:243368584

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李桥s2008100262

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值