首页 > 编程语言 >Java二分查找

Java二分查找

时间:2024-01-27 18:33:10浏览次数:27  
标签:二分 Java int 整数 nextInt 查找 数组 sc

二分查找

\789. 数的范围

给定一个按照升序排列的长度为 n 的整数数组,以及 q 个查询。

对于每个查询,返回一个元素 k 的起始位置和终止位置(位置从 0 开始计数)。

如果数组中不存在该元素,则返回 -1 -1

输入格式

第一行包含整数 n 和 q,表示数组长度和询问个数。

第二行包含 n个整数(均在 1∼10000 范围内),表示完整数组。

接下来 q行,每行包含一个整数 k,表示一个询问元素。

输出格式

共 q 行,每行包含两个整数,表示所求元素的起始位置和终止位置。

如果数组中不存在该元素,则返回 -1 -1

数据范围

1≤n≤100000 1≤q≤10000 1≤k≤10000

输入样例:
6 3
1 2 2 3 3 4
3
4
5
输出样例:
3 4
5 5
-1 -1

模板代码:

import java.util.Scanner;

public class BinarySearch {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int q = sc.nextInt();
        int[] a= new int[n];
        for (int i = 0; i < n; i++) {
            a[i] = sc.nextInt();
        }
        for (int i = 0; i < q; i++) {
            int k = sc.nextInt();
            int l =0;
            int r = n-1;
            //进行第一次查找,即查找第一次出现的位置
            while(l<r){
                int mid = (l+r)/2;
                if(a[mid]>=k){//正向查找,包右不包左
                    r =  mid;
                }else{
                    l = mid+1;
                }
            }
            if(a[l]!=k){//如果第一次查找失败,说明没有这个数,直接输出
                System.out.println("-1 -1");
            }else{//进行第二次查找
                System.out.print(l+" ");
                l =0;
                r= n-1;
                while(l<r){
                    int mid = (l+r+1)/2;//反向查找+1
                    if(a[mid]<=k){//反向查找,包左不包右
                        l=mid;
                    }else{
                        r=mid-1;
                    }
                }
                System.out.println(l);
            }
        }
    }
}

标签:二分,Java,int,整数,nextInt,查找,数组,sc
From: https://blog.51cto.com/u_16545968/9444251

相关文章

  • Java-05字符串
    tip:[start]字符串是计算机与人类沟通的重要手段。——闫学灿tip:[end]字符与整数的联系——ASCII码每个常用字符都对应一个-128~127的数字,二者之间可以相互转化。注意:目前负数没有与之对应的字符。常用ASCII值:'A'-'Z'是65~90'a'-'z'是97-122'0'-'9'是......
  • Java服务通过动态开关 Profiling 实现关键问题定位-故障定位
    作者观测云高级技术专家深圳办公室黄小龙简介Profile通过收集和分析应用程序运行过程中CPU、内存和I/O相关的数据,可以识别应用程序的性能瓶颈和错误,帮助我们更好地了解程序的运行情况。Profile是一种非常有价值的技术,通过Profile可以实现:识别性能瓶颈:Profiling可以帮......
  • 浅克隆和深克隆 :Java中的对象克隆方式探究
    在Java编程中,我们经常需要对对象进行复制或克隆操作.对象克隆是创建一个新的对象,并将原始对象的值复制给新的对象,以便独立使用或修改.在对象克隆中,我们经常遇到两种主要的克隆方式:浅克隆(ShallowClone)和深克隆(DeepClone).本文将介绍这两种克隆方式的概念、区别以及在Java......
  • Java中的枚举
    Java的枚举是一个特殊的数据类型,用于定义一组命名的常量,用关键字enum来声明。这在项目开发中经常会用到,除了可以定义一些常量类来提高代码的复用性外,有些必要情况需要通过枚举,因为枚举这个数类型不是什么字符串七七八八的,比如项目开发中会有公告字段的填充,像aop切面类时通过自定义......
  • java enum枚举实现机制
    在上篇文章中,我们对Java中的枚举类进行了详细的介绍。对于Enum还不了解的小伙伴,可以先预习《Java中的枚举类型(Enum)详解》一文。通过反编译,我们知道Java枚举类会在编译之后转化为一个继承了java.lang.Enum的类,而我们定义的每个枚举值都会在类的初始化阶段被实例化为我们所定义的......
  • 初识JAVA的第4天,循环结构
    day4java新手随笔练习publicclassDoc{Stringname;//属性/***since指明需要最早使用的jak版本*@authorwushen作者名*@paramname参数名*@return返回值情况*@throwsException异常抛......
  • 通信(二分+SPFA好题)
    第1题    通信查看测评数据信息某城市有N座通信基站,P条双向电缆,第i条电缆连接基站Ai和Bi。特别地,1号基站是通信公司的总站,N号基站位于一座农场中。现在,农场主希望对通信线路进行升级,其中升级第i条电缆需要花费Li。电话公司正在举行优惠活动。农场主可以指定......
  • [office] Excel表格中数据比对和查找的技巧是什么
    经常被人问到怎么对两份Excel数据进行比对,提问的往往都很笼统;在工作中,有时候会需要对两份内容相近的数据记录清单进行比对,需求不同。以下是小编为您带来的关于Excel表格中数据比对和查找的技巧,希望对您有所帮助。Excel表格中数据比对和查找的技巧Sheet1中包含了一份数......
  • SpringBoot启动项目报错:java.lang.UnsatisfiedLinkError: D:\files\software\jdk-1
    目录问题描述解决方法:问题描述在运行向的时候出现报错:java.lang.UnsatisfiedLinkError:D:\files\software\jdk-15.0.1\jdk-17.0.3.1\bin\tcnative-1.dll:Can'tloadIA32-bit.dllonaAMD64-bitplatform atjava.base/jdk.internal.loader.NativeLibraries.load(Native......
  • 二分查找法理解
    最开始做这道题的时候没想到用这种方法,我之后也在想二分查找法什么时候能用。其本质上还是在有序的范围中找到目标的数。这道题也就是要找到最大的合金数。最基本的二分查找题目就是找到具体的那个数,等不等于那个数就是作为限制条件。那这一题呢就是花费要小于限定值。因此不......