美文网首页
二分查找以及变体

二分查找以及变体

作者: 峰_a999 | 来源:发表于2019-01-17 19:45 被阅读0次

标准二分查找

使用场景

  1. 排序的数组(排序,且支持随机读取)
  2. 不大不小的数据, 大了的话,数组太大,木有那么大的连续空间,小了话,基本没有优势。
  3. 因为二分查找能够减少比较次数,所以如果比较操作比较复杂的话,那么不管数组大小都优先二分查找。
 public static int binarySearchStandard(int[] nums, int target) {
        int start = 0;
        int end = nums.length - 1;
        while (end >= start) {
            int mid = start + ((end - start) >> 1);
            if (nums[mid] < target) {
                start = mid + 1;
            } else if (nums[mid] > target) {
                end = mid - 1;
            } else {
                return mid;
            }
        }
        return -1;
    }

代码注意事项:

  1. 循环条件 end >= start
  2. mid = start + ((end - start) >> 1) 防止 采用 (end + start) / 2可能的越界行为。
  3. start = mid + 1; end = mid - 1;防止死循环。

变体:

  1. 找出有序数组里,第一个等于target的元素下标
  2. 找出有序数组里,最后一个等于target的元素下标
    public static int binarySearchFirstOne(int[] array, int target) {
        int start = 0;
        int end = array.length - 1;
        while (end >= start) {
            int mid = start + ((end - start) >> 1);
            if (array[mid] == target) {
                if (mid == 0 || array[mid - 1] != target) return mid;
                end = mid - 1;
            } else if (array[mid] < target) {
                start = mid + 1;
            } else {
                end = mid - 1;
            }
        }
        return -1;

    }


    public static int binarySerarchLastOne(int[] array, int target) {
        int start = 0;
        int end = array.length - 1;
        while (end >= start) {
            int mid = start + ((end - start) >> 1);
            if (array[mid] == target) {
                if (mid == (array.length - 1) || array[mid + 1] != target) return mid;
                start = mid + 1;
            } else if (array[mid] < target) {
                start = mid + 1;
            } else {
                end = mid - 1;
            }
        }
        return -1;
    }

变体

  1. 找出有序数组里,第一个大于target的元素下标
  2. 找出有序数组里,最后一个小于target的元素下标
    public static int binarySearchFirstGreaterOne(int[] array, int target) {
        int start = 0;
        int end = array.length - 1;
        while (end >= start) {
            int mid = start + ((end - start) >> 1);
            if (array[mid] > target) {
                if (mid == 0 || array[mid - 1] <= target) return mid;
                end = mid - 1;
            } else {
                start = mid + 1;
            }
        }
        return -1;


    }

    public static int binarySearchLastLessOne(int[] array,int target) {
        int start = 0;
        int end = array.length - 1;
        while (end >= start) {
            int mid = start + ((end - start) >> 1);
            if (array[mid] < target) {
                if (mid == (array.length - 1) || array[mid + 1] >= target) return mid;
                start = mid + 1;
            } else {
                end = mid - 1;
            }
        }
        return -1;
    }

上述的写法,很容易理解,不用想各种的边界条件,简直就是棒棒哒,核心就是对每次可能的候选值进行判断,而不是一窝蜂跳出循环之后在判断。

相关文章

  • 二分查找以及变体

    标准二分查找 使用场景 排序的数组(排序,且支持随机读取) 不大不小的数据, 大了的话,数组太大,木有那么大的连续...

  • 二分查找&变体

    二分查找其实占用的内存比较少,但是如果是寻找给定值的数据时,二分查找虽然占用内存小,但是用散列表或者二叉搜索树代替...

  • 二分查找(变体)

    今天写4种二分查找的变体分别是查找第一个值等于给定值的元素查找最后一个值等于给定值的元素查找第一个值大于等于给定值...

  • 【算法打卡60天】Day14二分查找(下):如何快速定位IP对应

    学习内容:四种常见的二分查找变形问题1.变体一:查找第一个值等于给定值的元素2.变体二:查找最后一个值等于给定值的...

  • 二分查找的变体

    二分查找在已经排序好的数组中寻找某个值。它是最常见的O(lgn)时间复杂度算法。 标准写法 大学教科书上只会给出一...

  • 二分查找的几种变体

    在一个有序数组中查找某个元素,采用二分查找是非常高效的,其查找只需要 O(logn) 的时间复杂度就可以了。如果数...

  • 二分查找(变体)代码框架

    1.说明 前面介绍了二分查找代码框架[https://www.jianshu.com/p/6423f7367615...

  • 二分查找的4种变体

    在基本的二分查找法中,我们规定给定数组是不重复且有序的(一般为升序),这几个变体的规则有些变化,仍然是升序元素,但...

  • 二分查找

    使用场景:下标随机访问元素的顺序表,有序,数据量适中(过小顺序查找,过大连续内存不够)二分法变体:查找第一个给定值元素。

  • LeetCode 专题:数组

    知识点总结 二分查找法(二分查找法是弱点)**以及相关的操作:递归实现和非递归实现,floor 和 ceiling...

网友评论

      本文标题:二分查找以及变体

      本文链接:https://www.haomeiwen.com/subject/jbxwdqtx.html