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