首页 > 其他分享 >二分查找

二分查找

时间:2022-12-14 23:34:52浏览次数:31  
标签:二分 right target nums int mid 查找 left

二分查找

零、二分查找框架

int binarySearch(int[] nums, int target) {
    int left = 0, right = ...;

    while(...) {
        int mid = left + (right - left) / 2;
        //不能使用 mid = (left + right) / 2 这种方式,因为left + right可能会导致加法溢出
        if (nums[mid] == target) {
            ...
        } else if (nums[mid] < target) {
            left = ...
        } else if (nums[mid] > target) {
            right = ...
        }
    }
    return ...;
}

一、寻找一个数(基本的二分搜索)

即搜索一个数,如果存在,返回其索引,否则返回 -1。

int binarySearch(int[] nums, int target) {
    int left = 0; 
    int right = nums.length - 1; // 注意

    while(left <= right) {//注意
        int mid = left + (right - left) / 2;
        if(nums[mid] == target)
            return mid; 
        else if (nums[mid] < target)
            left = mid + 1; // 注意
        else if (nums[mid] > target)
            right = mid - 1; // 注意
    }
    return -1;
}

注意点:

  1. 循环条件中是<=,而不是<

    因为right的初始化赋值是nums.length - 1,而不是nums.length,区别是:前者相当于两端都闭区间 [left, right], 后者相当于左闭右开区间 [left, right)

    在这个算法中使用的是前者[left, right]两端都闭的区间,这个区间其实就是我们每次进行搜索的区间

    找不到目标值时,我们需要通过while循环终止,然后返回-1,while循环在搜索区间为空的时候就应该终止

    while(left <= right) 的终止条件是 left == right + 1, 写成区间的形式就是 [right + 1, right],或者带个具体的数字进去 [3, 2],可见这时候区间为空

    while(left < right) 的终止条件是 left == right ,写成区间的形式就是 [right, right],或者带个具体的数字进去 [2, 2]这时候区间非空

  2. left = mid + 1right = mid - 1而不是 right = mid 或者 left = mid

    这也是二分查找的一个难点,不过只要能理解前面的内容,就能够很容易判断。

    刚才明确了「搜索区间」这个概念,而且本算法的搜索区间是两端都闭的,即 [left, right]。那么当我们发现索引 mid 不是要找的 target 时,下一步应该去搜索哪里呢?

    当然是去搜索区间 [left, mid-1] 或者区间 [mid+1, right] 对不对?因为 mid 已经搜索过,应该从搜索区间中去除

二、寻找左侧边界的二分搜索

int left_bound(int[] nums, int target) {
    int left = 0;
    int right = nums.length; // 注意
    
    while (left < right) { // 注意
        int mid = left + (right - left) / 2;
        if (nums[mid] == target) {
            right = mid;
        } else if (nums[mid] < target) {
            left = mid + 1;
        } else if (nums[mid] > target) {
            right = mid; // 注意
        }
    }
    return left;
}

三、寻找右侧边界的二分查找

int right_bound(int[] nums, int target) {
    int left = 0, right = nums.length;
    
    while (left < right) {
        int mid = left + (right - left) / 2;
        if (nums[mid] == target) {
            left = mid + 1; // 注意
        } else if (nums[mid] < target) {
            left = mid + 1;
        } else if (nums[mid] > target) {
            right = mid;
        }
    }
    return left - 1; // 注意
}

标签:二分,right,target,nums,int,mid,查找,left
From: https://www.cnblogs.com/ANDQE/p/16983957.html

相关文章

  • 查找算法
    9.1静态查找表仅作查询和检索操作使用 关键字数据元素中某个数据项的值,用以标识一个数据元素。若用此关键字可以识别唯一的一个数据元素,则称之为“主关键字”。若用......
  • CAD查找替换文字时如何使用通配符?CAD通配符使用技巧(二)
    通配符是一种特殊语句,主要有星号和问号,用来模糊搜索文件。上节CAD教程小编给大家分享了CAD中部分通配符的使用技巧,本文小编将继续给大家分享浩辰CAD软件中通配符的使用技巧......
  • 学会CAD文字递增标注、批量查找替换,就能事半功倍!
    CAD制图时,经常会遇到需要使用CAD文字、标注等命令完善图纸参数信息内容的情况。尤其是在标注连续性数字信息、或者批量修改相同文字内容时,传统做法是使用文字命令+复制命令......
  • 二分查找
    【二分查找】(O(logn))1.什么是二分查找二分查找也称折半查找(BinarySearch),它是一种效率较高的查找方法2.条件首先需要明确的是二分查找的对象应满足单调性,此外在查找过......
  • 数组里暴力查找单身狗和'^'异或快速查找单身狗
    intmain(){ chararr[]={1,2,3,4,5,7,5,1,2,3,4}; intsz=sizeof(arr)/sizeof(arr[0]); inti,ret=0; //0^a=a,a^b^a=b,a^a=0,异或满足交换规律,相同为0,反之为1; ......
  • 查找给定区间内第K大的元素
    查找给定区间内第K大的元素:(一)方法一:最小堆:O(n*lg(k))(1)思想:1.建立一个大小为k的最小堆2.注意:是给定区间,堆中存放的是给定区间的元素,不是给定区间的元素不会存放。说明:......
  • #yyds干货盘点# 名企真题专题: 二分查找
    1.简述:描述对于一个有序数组,我们通常采用二分查找的方式来定位某一元素,请编写二分查找的算法,在数组中查找指定元素。给定一个整数数组A及它的大小n,同时给定要查找的元素val,......
  • CAD查找替换文字时如何使用通配符?CAD通配符使用技巧(一)
    通配符是一种特殊语句,主要有星号和问号,用来模糊搜索文件。那么,CAD查找替换文字时如何使用通配符呢?本文小编就来给大家分享一下浩辰CAD软件中查找替换文字时使用通配符的操......
  • 四种二分查找法模板
    publicclassBinarySearch{publicstaticvoidmain(String[]args){int[]arr={1,2,3,3,3,4,5,5,7};intupper1=floor_lower(arr,3);......
  • 二分查找以及二分查找的变形
    二分查找以及二分查找的变形常规二分查找:在有序数组中找到num代码://1.常规二分查找首先需要保证这个数组是有序的//在有序数组中找到numpublicstaticboole......