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

二分查找

时间:2023-05-31 17:22:24浏览次数:28  
标签:二分 return target nums int length 查找 public

我们知道二分查找的基础写法有三种:

  1. 左闭右闭区间
    public static int binsearch(int[] nums, int target) {
        int l = 0, r = nums.length - 1;
        while (l <= r) {
            int m = (l + r) / 2;
            if (nums[m] == target) return m;
            if (nums[m] > target) {
                r = m - 1;
            } else {
                l = m + 1;
            }
        }
        return -1;
    }
}

因为这是一个闭区间,l和r都能取到,当区间只有一个数的时候,如[1],l是可以等于r的,所以这里判断是l <= r。
2. 左闭右开区间

    public static int binsearch(int[] nums, int target) {
        int l = 0, r = nums.length;
        while (l < r) {
            int m = (l + r) / 2;
            if (nums[m] == target) return m;
            if (nums[m] > target) {
                r = m;
            } else {
                l = m + 1;
            }
        }
        return -1;
    }

这边因为右边是开区间,r是取不到的,所以r的初始值是nums.length,而且因为r是取不到的,缩小右边区间是只需要让r = m。
3. 左开右开区间

    public static int binsearch(int[] nums, int target) {
        int l = -1, r = nums.length;
        while (l < r) {
            int m = (l + r) / 2;
            if (nums[m] == target) return m;
            if (nums[m] > target) {
                r = m;
            } else {
                l = m;
            }
        }
        return -1;
    }

这里两边都是开区间,l初始值得是-1,r初始值是nums.length,同样的缩小区间是l和r直接等于m。
上面的只是基础,如果涉及到一个数组中有相同的几个值,你是无法确定选出来的目标是哪一个,如果需要找出最左边的那个位置,应该怎么写?
这里主要是要确定如果中间的值正好等于target需要怎样舍弃哪一部分。
如果要找最左边的那个值,在nums等于target是应该让r缩小。看下面例子:
image
可以看到最终l就停留在了最左边的3。

    public static int binsearch(int[] nums, int target) {
        int l = 0, r = nums.length-1;
        while (l <= r) {
            int m = (l + r) / 2;
            if (nums[m] >= target) {
                r = m - 1;
            } else {
                l = m + 1;
            }
        }
        return l;
    }

相识的,如果我要得到最右边的3,我只需要改变相等情况下的区间修改。

    public static int binsearch(int[] nums, int target) {
        int l = 0, r = nums.length-1;
        while (l <= r) {
            int m = (l + r) / 2;
            if (nums[m] > target) {
                r = m - 1;
            } else {
                l = m + 1;
            }
        }
        return r;
    }

image
这里返回是r。

标签:二分,return,target,nums,int,length,查找,public
From: https://www.cnblogs.com/xiaoovo/p/17446797.html

相关文章

  • kibana智能检索发送多次_msearch —— 配置index pattern,同时设置时间段,就知道到底是
    kibanasite/elasticsearch/log-*/_field_stats?level=indices   返回:{"_shards":{"total":600,"successful":600,"failed":0},"indices":{"log-2017.11.22-19-192.168.2.3-93004":{"fields":{"Rec......
  • 二分法应用——搜索旋转数组,以前一直在纠结a[0],a[-1],a[mid], target三者关系,其实最
    62·搜索旋转排序数组  描述给定一个有序数组,但是数组以某个元素作为支点进行了旋转(比如,0124567可能成为4567012)。给定一个目标值target进行搜索,如果在数组中找到目标值返回数组中的索引位置,否则返回-1。你可以假设数组中不存在重复的元素。背完这套刷题模板,真......
  • Gym - 100851L [二分+线性推导]
    题目链接:https://vjudge.net/problem/Gym-100851L 解题思路:根据题目知道,墙的两边是不能放石头的,所以最终的结果肯定会收到两边墙的限制,从而使得答案不会超过1e9+1e5。此外我们再去二分最大高度,一个明显的结论就是以i为最高点建墙的话最少花费肯定是建一个金字塔形的墙面。但由于......
  • 基于长读的基因组重复序列查找技术研究
    基于长读的基因组重复序列查找技术研究郭睿深圳大学摘要:基因组中出现两次或者两次以上基本相同的序列称为重复序列。重复序列信息可以用来可以分析物种的进化,减少基因比对歧义,降低序列拼接数据缺失。与标准重复序列库对比,基于短读序列数据的重复序列查找技术得到的结果并......
  • linux 中find命令查找到文件仅显示文件名、路径名、完整路径
     001、[root@PC1test3]#lstest1test2[root@PC1test3]#tree##测试数据.├──test1│  └──a.txt└──test2└──b.txt2directories,2files[root@PC1test3]#find./-name"*.txt"##一般显示模式./test1/a.txt......
  • poj 2452(RMQ+二分)
    解题思路:这题实际上就是求某区间上的最值问题,可以先枚举区间的起始位置,然后二分去搜索比起始位置大的数且位置最远(这里可以用RMQ算法区间内的最小值),找到之后再利用RMQ算法找这段区间内的最大的,如果这段区间的长度比当前的最优值大,那么更新。详细的见代码。#include<iostream>#incl......
  • 初级数据结构--插入删除查找表
    插入:头部插入、尾部插入、任意位置插入删除:定位删除查找:值查找、定位查找//定义表typedefstruct{ intdata[MAXSIZE]; intlength;}SqList;//初始化表voidInitSqList(SqList*pl){ inti=0; for(i=0;i<MAXSIZE;i++) pl->data[i]=0; pl->length=0;}//......
  • Unity 对多边形进行矩形分割和查找最大内接矩形
     花了点时间实现了对任意多边形进行矩形分割的功能,有需要的小伙伴可以点这里查看源码 一、实现效果:1、对图片里的内容进行矩形分割     2、对多边形顶点数据进行矩形分割    3、查找图片里内容的最大内接矩形    4、查找多边形顶点数据内的最大内......
  • POJ 1505(二分+贪心)
    题意:给一些书,这些书有不同的页数,让把这些书分成k份,必须是连续的,问这些份中页数和的最大值最小是多少。解题思路:知道了页数和的范围,而且书都是连续的,要找到页数和最大值的最小值可以直接二分答案。。AC:#include<iostream>#include<cstdlib>#include<cstring>usingnamespacestd......
  • 2018ACM浙江省赛 ZOJ 4029 Now Loading!!!(二分)
    NowLoading!!!TimeLimit: 1Second     MemoryLimit: 131072KBDreamGridhas  integers .DreamGridalsohas foragivennumber ,where , .InputTherearemultipletestcases.Thefirstlineofinputisaninteger Thefirstlinecon......