数的范围

789. 数的范围

给定一个按照升序排列的长度为 nn 的整数数组,以及 qq 个查询。对于每个查询,返回一个元素 kk 的起始位置和终止位置(位置从 00 开始计数)。如果数组中不存在该元素,则返回 -1 -1

输入格式

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

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

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

输出格式

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

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

数据范围

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

输入样例:

1
2
3
4
5
6 3
1 2 2 3 3 4
3
4
5

输出样例:

1
2
3
3 4
5 5
-1 -1

解法:二分法

使用两个模板。分别求出该数的左右坐标

代码为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
import java.util.*;
import java.io.*;
public class Main{
static int N = 100010;
static int Q = 10010;
static int K = 10010;
static int a[] = new int[N];
static int q[] = new int[Q];
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
PrintWriter pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));
String s[] = br.readLine().split(" ");
int n[] = new int[2];
n[0] = Integer.parseInt(s[0]); //所有元素的个数
n[1] = Integer.parseInt(s[1]); //要检索的元素个数
String ss[] = br.readLine().split(" ");
for (int i = 0;i<n[0];i++){
a[i] = Integer.parseInt(ss[i]); //所有的元素
}
for (int i = 0;i<n[1];i++){
q[i] = Integer.parseInt(br.readLine());//要检索的元素
}

//开始
for (int j = 0;j<n[1];j++) {
int l = 0;
int r = n[0] - 1;
while (l < r) {
int mid = (l + r) >> 1;
if (a[mid] >= q[j]) r = mid;
else l = mid + 1;
}
if (a[l]==q[j]) System.out.print(l+" ");
else System.out.print(-1+" ");
l = 0;
r = n[0] - 1;
while (l < r) {
int mid = (l + r + 1) >> 1;
if (a[mid] <= q[j]) l = mid;
else r = mid - 1;
}
if (a[l]==q[j]) System.out.print(l+" ");
else System.out.print(-1+" ");
System.out.println();
}
}
}

数的范围
http://example.com/2022/06/13/数的范围/
作者
zlw
发布于
2022年6月13日
许可协议