题解:AcWing 789. 数的范围 JAVA

简介: 题解:AcWing 789. 数的范围 JAVA

       

题目描述

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

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

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

输入格式

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

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

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

输出格式

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

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

数据范围

1≤n≤100000

1≤n≤100000

1≤q≤10000

1≤q≤10000

1≤k≤10000

1≤k≤10000

样例

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

优化二分查找跳过重复元素

此题采用正常的二分查找会超时,但我们可以注意到,此题有很多重复的数字例如(111223333)

我们二分查找时左边查找到第一个1的时候就可以跳过其余的1

可以通过一个数组来实现记录重复数字的个数,在二分查找时可以直接跳过

java代码

package 蓝桥;
import java.util.Scanner;
/******
 * 
 * @author genji
 * 此题采用正常的二分查找会超时,但我们可以注意到,此题有很多重复的数字例如(111223333)
 * 我们二分查找时左边查找到第一个1的时候就可以跳过其余的1
 * 可以通过一个数组来实现记录重复数字的个数,在二分查找时可以直接跳过
 */
public class 数的范围_789 {
  public static void main(String[] args) {
    Scanner scanner=new Scanner(System.in);
    int n=scanner.nextInt(),m=scanner.nextInt();
    int[] a=new int[n];
    int[] b=new int[n];//b中存放重复数字的数量,因为下面采用二分查找所以有前后两个标志
    //例如a 中的数为1,1,1,1,1,2,2,2,2,3,3,4,4,4,4,5
    //则b中的数为      5,0,0,0,5,4,0,0,4,2,2,4,0,0,4,1
    //使其在查找时跳过重复的数字
    int c=0,i;
    for (i = 0; i < n; i++) {
      a[i]=scanner.nextInt();
      if (i==0||a[i]==a[i-1]) {
        c++;        //如果是第一个数或者和前面数字相同的数则记录相同数字的个数
      }
      else if (a[i]!=a[i-1]) {
        b[i-1]=c;
        b[i-c]=c;     //将相同数字个数赋到b数组相同下标的头和尾
        c=1;
      }
    }
    b[i-1]=c;
    b[i-c]=c;
    for (i = 0; i < b.length; i++) {
      System.out.println(b[i]);
    }
    while (m-->0) {
      int l=0,r=n-1;
      int q=scanner.nextInt();
      while (l<r) {
        if (a[l]!=q) {
          l+=b[l];//   跳过重复的数字
        }
        if (a[r]!=q) {
          r-=b[r];//   跳过重复的数字
        }
        if (a[r]==q&&a[l]==q) {
          System.out.println(l+" "+r);
          break;
        }
      }
      if(a[l]!=q&&a[r]!=q)
      {
        System.out.println(-1+" "+-1);
      }
    }
  }
}


相关文章
|
Java
AcWing 788. 逆序对的数量_Java
AcWing 788. 逆序对的数量_Java
63 0
|
算法 Java API
PAT乙级【Java题解合集】
这个暑假博主用大概两周不到的闲暇时间把PAT乙级的110道算法题全部肝完了,个人感觉题目的难度大部分在中等偏下,大概有二十道左右的题目还是蛮有意思的,值得细细去钻研,本专栏非常适合新手入门算法,也适合Java算法老手巩固一些基本知识点,由于C站上关于PAT乙级Java的题解很少,这边博主也是用心给大家整理了110道题目的JAVA详解,题解代码中会有博主踩坑后放的注释可供大家学习参考,后期会不断完善专栏内容,欢迎您的订阅!
PAT乙级【Java题解合集】
|
存储 安全 Java
2020年第十一届java B组蓝桥杯省赛真题及题解
蓝桥杯是指蓝桥杯全国软件和信息技术专业人才大赛。是由工业和信息化部人才交流中心举办的全国性IT学科赛事。共有北京大学、清华大学、上海交通大学等全国1200余所高校参赛。
407 0
2020年第十一届java B组蓝桥杯省赛真题及题解
|
人工智能 缓存 Java
2019年第十届java B组蓝桥杯省赛真题及题解
蓝桥杯是指蓝桥杯全国软件和信息技术专业人才大赛。是由工业和信息化部人才交流中心举办的全国性IT学科赛事。共有北京大学、清华大学、上海交通大学等全国1200余所高校参赛。
256 0
2019年第十届java B组蓝桥杯省赛真题及题解
|
人工智能 算法 Java
2016年第七届Java B组蓝桥杯省赛真题解及析
蓝桥杯是指蓝桥杯全国软件和信息技术专业人才大赛。是由工业和信息化部人才交流中心举办的全国性IT学科赛事。共有北京大学、清华大学、上海交通大学等全国1200余所高校参赛。
141 0
2016年第七届Java B组蓝桥杯省赛真题解及析
|
Java 测试技术
蓝桥练习题题解——作物杂交——Java
蓝桥练习题题解——作物杂交——Java
190 0
蓝桥练习题题解——作物杂交——Java
|
Java
【大厂Java并发编程面试题解】显式锁(Explicit Locks)(上)
Java5之前只能用synchronized和volatile,Java5后Doug Lea提供了ReentrantLock,并非为了替代内置锁,而是当内置锁的机制不适用时,作为一种可选择的高级功能。 内置锁不适用的场景包括: 无法中断一个正在等待获取锁的线程 无限的锁等待 内置锁必须放在代码块里(编程有些局限性) 所以提供了J.U.C的Lock接口及实现。
115 0
【大厂Java并发编程面试题解】显式锁(Explicit Locks)(上)
|
算法 Java
【Java算法题解】剑指 Offer II 022. 链表中环的入口节点
解析 先通过快慢指针判断有无环 无环 直接返回null 有环 假设起点到环起点的距离是a,环的长度是k,且此时A、B在距离环起点x距离处相遇。
113 0
|
算法 Java
【大厂Java并发编程面试题解】显式锁(Explicit Locks)(下)
Java5之前只能用synchronized和volatile,Java5后Doug Lea提供了ReentrantLock,并非为了替代内置锁,而是当内置锁的机制不适用时,作为一种可选择的高级功能。 内置锁不适用的场景包括: 无法中断一个正在等待获取锁的线程 无限的锁等待 内置锁必须放在代码块里(编程有些局限性) 所以提供了J.U.C的Lock接口及实现。
121 0
下一篇
DataWorks