给定 nn 个区间 [li,ri][li,ri],要求合并所有有交集的区间。
注意如果在端点处相交,也算有交集。
输出合并完成后的区间个数。
例如:[1,3][1,3] 和 [2,6][2,6] 可以合并为一个区间 [1,6][1,6]。
输入格式
第一行包含整数 nn。
接下来 nn 行,每行包含两个整数 ll 和 rr。
输出格式
共一行,包含一个整数,表示合并区间完成后的区间个数。
数据范围
1≤n≤1000001≤n≤100000,
−109≤li≤ri≤109−109≤li≤ri≤109
输入样例:
5
1 2
2 4
5 6
7 8
7 9
输出样例:
3
本题为经典贪心算法,求区间合并问题主要分为三步:
1.将区间按照区间左端点大小依次排序
2.将区间扫描,并根据扫描区间大小关系将区间进行合并(区间值之间大小关系,分为三种,主要根据如下代码)
import java.util.*;
@SuppressWarnings("all")
public class Main{
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
ArrayList<Pair> arrayList = new ArrayList<>();
int x,y;
for(int i = 0; i < n ; i++){
x = scanner.nextInt();
y = scanner.nextInt();
arrayList.add(new Pair(x, y));
}
ArrayList<Pair> arrayList1 = merge(arrayList);
System.out.println(arrayList1.size());
}
public static <T> ArrayList<Pair> merge(ArrayList<Pair> arrayList){
int first = (int)(-2 * Math.pow(10, 9)),second = (int)(-2 * Math.pow(10, 9));
arrayList.sort(new Comparator<Pair>() {
@Override
public int compare(Pair o1, Pair o2) {
if(o1.first > o2.first){
return 1;
}
return -1;
}
});
ArrayList<Pair> arrayList2 = new ArrayList<>();
//进行遍历查找
for(Pair pair : arrayList){
if(pair.first > second){
if(second != -2 * Math.pow(10, 9)){
arrayList2.add(new Pair(first, second));
}
first = pair.first;
second = pair.second;
}else{
second = Math.max(second, pair.second);
}
}
if(second != -2 * Math.pow(10, 9)){
arrayList2.add(new Pair(first, second));
}
return arrayList2;
}
}
class Pair{
int first,second;
public Pair(int first,int second){
this.first = first;
this.second = second;
}
}