0
点赞
收藏
分享

微信扫一扫

二分查找公式化代码

kiliwalk 2022-02-12 阅读 45
算法

文章目录

本文核心

二分查找可限于有序数组中查找某个值,如果说这个值存在多个那么二分查找可以查找它的左右边界

作者建议

       这篇文章主要是对labuladong的算法文章中的经典公式拿了出来,方便直接复制拿去使用。

  • 如果说使用的时候建议对二分查找有一定的了解,如果不是特别了解的话,建议先去看看labuladong的二分查找算法详解(改进版),把细节搞懂了之后公式复制完全可以直接使用。
  • 如果说读者对于二分已经了熟于心,那么代码直接拷走使用,对应不同的算法题细节方面在进行具体的魔改。

查找具体的值

   /**
     * 二分查找
     * @param list 被查找的序列  必须是有序的从小到大
     * @param target 目标
     * @return 目标索引,如果没有则返回-1
     */
    public static int binarySearch(int[] list, int target) {
        if (list.length==0) {
            return -1;
        }
        int left = 0, right = list.length - 1;
        while (left <= right) {
            int mid = left + ((right - left) >> 1);
            if (target == list[mid]) {
                return mid;
            } else if (list[mid] > target) {
                right = mid - 1;
            } else if (list[mid] < target) {
                left = mid + 1;
            }
        }
        return -1;
    }

查找左边界

   
	/**	
     * 查找target在数组中最左边的数的索引
     * @param list 被查找的序列<br/>必须是有序的 从小到大
     * @param target  查找的值
     * @return  target 在数组中最左边的数的索引
     */
    public static int leftBound(int[] list, int target) {
        if (list.length==0) {
            return -1;
        }
        int left = 0, right = list.length - 1;
        while (left <= right) {
            int mid = left + ((right - left) >> 1);
            if (target == list[mid]) {
                 right = mid - 1;
            } else if (list[mid] > target) {
                right = mid - 1;
            } else if (list[mid] < target) {
                left = mid + 1;
            }
        }
        if (left >= list.length || list[left] != target) {
            return -1;
        }
        return left;
    }

查找右边界

/**
     * 查0找target在数组中最右边的数的索引
     * @param list 被查找的序列——————必须是有序的 从小到大
     * @param target  查找的值
     * @return  target在数组中最右边的数的索引
     */
    public static int rightBound(int[] list, int target) {
        if (list.length==0) {
            return -1;
        }
        int left = 0, right = list.length - 1;
        while (left <= right) {
            int mid = left + ((right - left) >> 1);
            if (target == list[mid]) {
                  left = mid + 1;
            } else if (list[mid] > target) {
                right = mid - 1;
            } else if (list[mid] < target) {
                left = mid + 1;
            }
        }
        if (right < 0 || list[right] != target) {
            return -1;
        }
        return right;
    }
举报

相关推荐

0 条评论