解释都在代码中
/*
1. 将所有区间按左端点从小到大进行排序
2. 从前往后枚举所有区间,在能覆盖start的区间中,选择右端点最大的区间,然后将start更新为右端点最大值
*/
import java.util.*;
public class Main {
static int N = 100010;
static int n;
static Range[] range = new Range[N];
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int start = sc.nextInt(), end = sc.nextInt();
n = sc.nextInt();
for(int i = 0; i < n; i ++) {
int l = sc.nextInt(), r = sc.nextInt();
range[i] = new Range(l, r);
}
Arrays.sort(range, 0, n, (o1, o2) -> {
return o1.l - o2.l;
});
// res 来记录需要的区间数
int res = 0;
// 来标志是否已经完成覆盖
boolean success = false;
for(int i = 0; i < n; i ++) {
// 这里的r必须在循环里面, 原因是:下面的if(r < start),就会出现错误,
// 因为上一次后,如果r不重新赋值,那么 r == start, 导致不能出现 r < start 的情况
int j = i, r = (int)-2e9;
// 这里采用双指针算法
// 找能覆盖start的区间中,选择右端点最大的区间
while(j < n && range[j].l <= start) {
r = Math.max(r, range[j].r);
j ++;
}
// 如果某次循环+更新下来,r不在start的右边,直接就说明不能完全覆盖
if(r < start) {
res = -1;
break;
}
res ++;
if(r >= end) {
success = true;
break;
}
// 更新start
start = r;
// 由于i++,所以需要j-1
i = j - 1;
}
if(!success) res = -1;
System.out.println(res);
}
}
class Range {
int l, r;
public Range(int l, int r) {
this.l = l;
this.r = r;
}
}
求问一下,这个第一个测试用例过不了提交却可以ac是怎么回事
太久了,忘了。你可以参考下其他人的打卡或者题解(qaq)
if(r>=end) 少个等于号
感谢提醒