数的范围(整数二分)

Posted qdu-lkc

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数的范围(整数二分)相关的知识,希望对你有一定的参考价值。

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

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

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

输入格式

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

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

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

输出格式

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

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

数据范围

1n1000001≤n≤100000
1q100001≤q≤10000
1k100001≤k≤10000

输入样例:

6 3
1 2 2 3 3 4
3
4
5

输出样例:

3 4
5 5
-1 -1

可以直接顺序查找,但时间O(n);而二分查找时间O(logn)
import java.util.Scanner;

public class Main {
         public static void main(String[] args) {
               Scanner scan=new Scanner(System.in);
               int n=scan.nextInt();
               int q=scan.nextInt();
               int a[]=new int[n];
               for(int i=0;i<n;i++) a[i]=scan.nextInt();
               while(q-->0){
                    int num=scan.nextInt();
                    //先找到左边界
                    int l=0,r=n-1;
                    while(l<r){
                         int mid=l+r>>1;
                         if(a[mid]>=num) r=mid;
                         else l=mid+1;
                    }
                    if(a[l]!=num){
                          System.out.println("-1 -1");
                    }
                    //如果有这个数,再找右边界
                    else{
                          System.out.print(l+" ");
                          l=0;r=n-1;
                          while(l<r){
                                 int mid=l+r+1>>1;
                                 if(a[mid]<=num) l=mid;
                                 else r=mid-1;
                          }
                          System.out.println(l);
                    }
               }
        }
}

 

以上是关于数的范围(整数二分)的主要内容,如果未能解决你的问题,请参考以下文章

数的范围(整数二分)

整数二分浮点二分代码模板

二分算法(以 数的范围 为例)

二分——数的范围

二分——数的范围

算法789. 数的范围——二分