数的范围(整数二分)

2020-01-12 16:03:29来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

数的范围(整数二分)

给定一个按照升序排列的长度为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);
                    }
               }
        }
}

 


原文链接:https://www.cnblogs.com/qdu-lkc/p/12184405.html
如有疑问请与原作者联系

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:ArrayList集合存储VO封装对象后调用的问题

下一篇:MyBatis 查询结果的缓存