二分法相关

1:二分法判断一个数组中是否含有某个值

/**
 * 如何去使用二分搜索去有序数组大于等于某个数的最左侧位置
 * 二分如何考虑?
 * 用中点值和target比较
 * 如果是大于等于target{
 *     那么我们的值应该在mid的左边;设置右边界R=mid-1
 * }
 * 如果是小于target{
 *     那么我们的值应该在mid的右边;设置左边界L=mid+1
 * }
 *
 */
public class BSLeft {
    public static void main(String[] args) {
        int[] arrs={1,2,3,4,};
    }
    public static int bsLeft(int[] array,int target){
        int mid;
        int L=0;
        int R=array.length-1;
        while (L<=R){
            mid=L+((R-L)>>2);
            if (array[mid]>=target){
                //右边界不断缩进的过程
                R=mid-1;
            }else{
                L=mid+1;
            }
        }
        return L;
    }
}

2:二分法去找有序数组中大于等于某个数的最左侧值的下标

/**
 * 如何去使用二分搜索去有序数组大于等于某个数的最左侧位置
 * 二分如何考虑?
 * 用中点值和target比较
 * 如果是大于等于target{
 *     那么我们的值应该在mid的左边;设置右边界R=mid-1
 * }
 * 如果是小于target{
 *     那么我们的值应该在mid的右边;设置左边界L=mid+1
 * }
 *
 */
public class BSLeft {
    public static void main(String[] args) {
        int[] arrs={2,3,5,7};
        int i = bsLeft(arrs, 2);
        System.out.println(i);

    }
    public static int bsLeft(int[] array,int target){
        int L = 0;
        int R = array.length - 1;
        while (L <= R) {
            int mid = L + ((R - L) >> 1);
            if (array[mid] >= target) {
                R = mid - 1;
            } else {
                L = mid + 1;
            }
        }
        /**
         * [2,3,4,5] 如果目标是小于数组中的最小值或者目标大于数组中的最大值,则返回 -1
         * 其余情况 返回确定下标值
         */
        if (L==array.length){
            return -1;
        }else if (L==0){
            if (array[L]==target){
                return L;
            }else{
                return -1;
            }
        }else{
            return L;
        }
    }
}

3:二分法去找有序数组中小于等于某个数的最右侧值的下标

/**
 * 需求去找一个有序数组中大于等于某个数的最右侧位置
 * 不断向调整左侧的下标向右侧进行逼近
 */
public class BSright {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3, 4, 5};
        System.out.println(bsRight(arr, -4));
    }

    public static int bsRight(int[] arrs, int target) {
        int L = 0;
        int R = arrs.length - 1;
        int mid;
        while (L <= R) {
            mid = L + ((R - L) >> 1);
            if (arrs[mid] <= target) {
                L = mid + 1;
            } else {
                R = mid - 1; //最后执行
            }
        }
       if (R==arrs.length){
           return -1;
       }else if (R==-1){
           return -1;
       }else {
           return R;
       }

    }
}

4:二分法找局部最小值

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值