题目
给定 n 个区间 [li,ri],要求合并所有有交集的区间。
注意如果在端点处相交,也算有交集。
输出合并完成后的区间个数。
例如:[1,3] 和 [2,6] 可以合并为一个区间 [1,6]
输入格式
第一行包含整数 n
接下来 n 行,每行包含两个整数 l 和 r
输出格式
共一行,包含一个整数,表示合并区间完成后的区间个数。
数据范围
1≤n≤100000
−109≤li≤ri≤109
输入样例:
5
1 2
2 4
5 6
7 8
7 9
输出样例:
3
代码和思路
-
读取输入的数量 n。
-
创建 Pair 类数组 p,用于存储每个区间的左右边界。
-
读取每个区间的左右边界,并将其存储到 Pair 数组中。
-
初始化最终结果 ans 为 1,将 Pair 数组按照左边界从小到大排序。
-
初始化当前区间的左右边界为 p[0].x 和 p[0].y。
-
遍历每个区间:
- 如果当前区间的左边界小于等于当前区间的右边界,则将当前区间的右边界更新为两者的最大值。
- 否则,将结果 ans 加 1,并更新当前区间的左右边界。
-
输出结果 ans
import java.util.Arrays;
import java.util.Scanner;
public class Main {
static int n;
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 读取输入的数量 n
n = in.nextInt();
// 创建 Pair 数组 p,用于存储区间的左右边界
Pair[] p = new Pair[n + 1];
// 读取每个区间的左右边界,并将其存储到 Pair 数组中
for (int i = 0; i < n; i++) {
int l = in.nextInt();
int r = in.nextInt();
p[i] = new Pair(l, r);
}
// 初始化最终结果 ans 为 1,将 Pair 数组按照左边界从小到大排序
int ans = 1;
Arrays.sort(p, 0, n);
// 初始化当前区间的左右边界为 p[0].x 和 p[0].y
int l = p[0].x, r = p[0].y;
// 遍历每个区间
for (int i = 1; i < n; i++) {
// 如果当前区间的左边界小于等于当前区间的右边界,则将当前区间的右边界更新为两者的最大值
if (p[i].x <= r) {
r = Math.max(r, p[i].y);
} else { // 否则,将结果 ans 加 1,并更新当前区间的左右边界
ans++;
l = p[i].x;
r = p[i].y;
}
}
// 输出结果 ans
System.out.println(ans);
}
// 自定义 Pair 类,用于存储区间的左右边界,并实现 Comparable 接口用于排序
public static class Pair implements Comparable<Pair> {
int x, y;
public Pair(int x, int y) {
this.x = x;
this.y = y;
}
// 按照左边界从小到大排序
@Override
public int compareTo(Pair o) {
return Integer.compare(this.x, o.x);
}
}
}