算法小知识-------01.28-------二分查找

100 阅读2分钟

这是我参与2022首次更文挑战的第7天,活动详情查看:2022首次更文挑战

二分查找

该题出自力扣的704题——二分查找【简单题】

审题

给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target  ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。

  • 这题可以说是二分查找算法最直观的实现了,纯粹的算法。
  • 二分:
    • 取一个升序的集合,并取中间索引的值;
    • 划分为两个集合,根据目标值进入其中一个集合;
    • 重复上述步骤,直到找到目标值。

编码

    public int search(int[] nums, int target) {
        if(nums == null){
            return -1;
        }
        int front = 0;
        int end = nums.length-1;
        while (end>=front){
            int mid = front+(end-front)/2;
            if (nums[mid]>target){
                end = mid-1;
            }else if (nums[mid]<target){
                front = mid+1;
            }else if (nums[mid] == target){
                return mid;
            }
        }
        return -1;
    }

image.png

第一个错误的版本

该题出自力扣的278题——第一个错误的版本【简单题】

审题

你是产品经理,目前正在带领一个团队开发新的产品。不幸的是,你的产品的最新版本没有通过质量检测。由于每个 > 版本都是基于之前的版本开发的,所以错误的版本之后的所有版本都是错的。 假设你有 n 个版本 [1, 2, ..., n],你想找出导致之后所有版本出错的第一个错误的版本。 你可以通过调用 bool isBadVersion(version) 接口来判断版本号 version 是否在单元测试中出错。实现一个函 > 数来查找第一个错误的版本。你应该尽量减少对调用 API 的次数。

  • 首先该题的题意就是总一个升序数组中找出错误的版本
  • 显而易见就是二分的练习题
    • 给定的一个数值,并且给定一个API;
    • 给一个值的参数,实际上就是给了一个数组,从1到n;
    • 二分查找

编码

    public int firstBadVersion(int n) {
       int left = 1;
       while(n > left){
           int mid = left + (n - left)/2;
           if(isBadVersion(mid)){
               n = mid;
           }else{
               left = mid+1;
           }
       }
       return n;
   }

image.png

总结

二分查找相对来说,还是比较好辨认出,但是缺点也很明显,需要具备数组有序的条件