0
点赞
收藏
分享

微信扫一扫

二分法

有序数组

使用二分法查找指定数值

public static boolean exist(int[] arr,int num){
    if (null==arr||arr.length==0)
        return false;
    int L = 0;
    int R = arr.length -1;
    int mid = 0;
    while (L<R){
        //(L+R)/2在L与R接近极限的时候,计算会溢出,R-L带符号右移1位即除以2
        mid = L + ((R - L) >> 1);
        if (arr[mid] == num)
            return true;
        else if (arr[mid] > num)
            R = mid - 1;
        else
            L = mid + 1;
    }
    return arr[L] == num;
}

找>=某个数最左侧位置

//arr中,找满足>=value的最左位置值
public static int nearestLeftIndex(int[] arr,int value){
    int L = 0;
    int R = arr.length-1;
    int index = -1;
    int mid = 0;
    while (L<=R){
        mid = L + ((R-L)>>1);
        if (arr[mid]>=value){
            index = mid;
            R = mid - 1;
        }else{
            L = mid + 1;
        }
    }
    return index;
}

找<=某个数最右侧位置

//<=value的最右边位置值
public static int nearestRightIndex(int[] arr,int value){
    int L = 0;
    int R = arr.length;
    int index = -1;
    int mid = 0;
    while (L<=R){
        mid = L + ((R-L)>>1);
        if (arr[mid]<=value){
            index = mid;
            L = mid + 1;
        }else{
            R = mid - 1;
        }
    }
    return index;
}

无序数组

局部最小值

无序数组,任何两个相邻的数不相等,找出任一局部最小值 即 arr[i-1]>arr[i]<arr[i+1]

  1. 若0~1单调递增,那么返回0位置,
  2. 若N-2~N-1单调递减,返回N-1位置
  3. 若0~1递减且N-2~N-1递增,那么在1~N-2中必有一个值满足局部最小条件(具体证明参考罗尔中值定理)
  4. 这种特殊的情景下,无序数组也可以使用二分法,如下

public static int getLessIndex(int[] arr){
    if (null==arr||arr.length==0)
        return -1;
    if (arr.length==1 || arr[0] < arr[1])
        return 0;
    if (arr[arr.length-1] < arr[arr.length-2])
        return arr.length - 1;
    int L = 1;
    int R = arr.length - 2;
    int mid = 0;
    while (L < R){
        mid = L + ((R-L)>>1);
        if (arr[mid] > arr[mid-1]){
            R = mid - 1;
        }else if (arr[mid] > arr[mid+1]){
            L = mid + 1;
        }else{
            return mid;
        }
    }
    return L;
}

举报

相关推荐

0 条评论