找整型不重复有序数组中到值等于下标的元素

问题描述:

给定一有序、不含重复元素的整型数组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;
     }

 

你可能感兴趣的:(java,二分搜索)