问题描述:
给定一有序、不含重复元素的整型数组arr,找到满足arr[i] == i中最小的元素。要求时间复杂度为O(logN).
实现思路:
由于下标的增长速度始终为一,而arr的增长速度恒大于等于一,可以利用这一点将搜索域逐步减半;对中间元素进行判断若大于其下标,则可知后半段是不存在满足题设条件的解的;若小于其下标,同理前半段无可行解;等于时,之后无可行解。
如此便可以O(logN)的时间复杂度实现该算法。
代码实现如下:
public static int selution(int[] arr) {
int left = 0, right = arr.length -1,mid = 0;
while (right - left > 1) {
if(arr[left] > right || arr[right] < left) {
return -1;
}
mid = left + (right - left) / 2;
/*
* arr[mid] > mid 时,由于arr也是递增的并且递增速度大于等于1,因此arr[mid]之后不存在arr[i] = i的情况
*/
if(arr[mid] >= mid) {
right = mid;
}else {
left = mid;
}
}
if(arr[left] == left) {
return left;
}
if(arr[right] == right) {
return right;
}
return -1;
}