区间合并算法

目录

一般要求

解决方法 

题目


一般要求

给定 n 个区间 [ \ l_i,r_i\ ],要求合并所有有交集的区间。

注意如果在端点处相交,也算有交集。

例如:[1,3] 和 [2,6] 可以合并为一个区间 [1,6]。

           [1,6] 和 [2,3] 可以合并为一个区间 [1,6]。

           [1,3] 和 [5,6] 就不能合并为一个区间。

解决方法 

区间合并问题一般就是按照某个区间的左端点或者右端点排序。

如果按照左端点排序,一般就是根据上一个区间的右端点和当前区间的左端点进行比较,看是否能够合并,如果两个区间是分开的,那就不能合并。

这个题主要就是注意一下细节问题。

// 伪代码:

PriorityQueue q  // 我这里定义了一个优先队列,存储所有的区间,为的是直接给左端点排序,也可以用sort

start = -10e9  // 记录区间的左端点

end  = -10e9  // 记录区间的右端点

while( q 不空){

        l , r = 取出队头的两个元素(左端点和右端点)

        if( l > start )更新start和end为当前区间的值;   // 说明是第一个区间 或者 是该区间与上个区间没有相交的部分

        else end = max ( end , r ) // 否则就合并两个区间,右端点取最大值 ,因为两个区间有可能相交,也有可能一个区间被另一个区间覆盖

}

题目

给定 n 个区间 [ \ l_i,r_i\ ],要求合并所有有交集的区间。

注意如果在端点处相交,也算有交集。

输出合并完成后的区间个数。

例如:[1,3] 和 [2,6] 可以合并为一个区间 [1,6]。

输入格式

第一行包含整数 n。

接下来 n 行,每行包含两个整数 l 和 r。

输出格式

共一行,包含一个整数,表示合并区间完成后的区间个数。

数据范围

1≤n≤100000,
−10^9≤li≤ri≤10^9

输入样例:

5
1 2
2 4
5 6
7 8
7 9

输出样例:

3
import java.io.*;
import java.util.*;
class Main{
    static int N = 100010;
    static int n;
    static List<PII> l = new ArrayList<>();
    public static void main(String[] args) throws IOException{
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        n = Integer.parseInt(in.readLine());
        for(int i=0;i<n;i++){
            String[] str = in.readLine().split(" ");
            l.add(new PII(Integer.parseInt(str[0]),Integer.parseInt(str[1])));
        }
        Collections.sort(l); // 排序

        // 进行区间合并
        int begin = (int)-10e9;
        int end = (int)-10e9;
        int res = 0;
        for(PII i: l){
            if(i.l>end){
                begin=i.l;
                end = i.r;
                res++;
            }
            else{
                end = Math.max(end,i.r);
            }
        }
        System.out.println(res);
    }
}
class PII implements Comparable<PII>{ // 存储区间,并实现排序方法
    int l;
    int r;
    public PII(int l,int r){
        this.l = l;
        this.r = r;
    }
    
    public int compareTo(PII p){
        return Integer.compare(l,p.l);
    }
}

相关推荐

  1. 算法| ss 合并区间

    2024-03-11 20:02:02       32 阅读
  2. 面试算法74:合并区间

    2024-03-11 20:02:02       48 阅读
  3. C++算法区间合并

    2024-03-11 20:02:02       36 阅读
  4. 算法详解】力扣56.合并区间

    2024-03-11 20:02:02       59 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-11 20:02:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-11 20:02:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-03-11 20:02:02       82 阅读
  4. Python语言-面向对象

    2024-03-11 20:02:02       91 阅读

热门阅读

  1. springmvc的使用方法及运行原理

    2024-03-11 20:02:02       51 阅读
  2. 回溯算法模板框架

    2024-03-11 20:02:02       42 阅读
  3. 【Unity】【VR开发】如何避免按键冲突

    2024-03-11 20:02:02       39 阅读
  4. 20240311

    2024-03-11 20:02:02       38 阅读
  5. 聚酰胺12(PA 12&尼龙12)行业调研报告

    2024-03-11 20:02:02       51 阅读