Acwing803区间合并

题目

给定 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

代码和思路

  1. 读取输入的数量 n。

  2. 创建 Pair 类数组 p,用于存储每个区间的左右边界。

  3. 读取每个区间的左右边界,并将其存储到 Pair 数组中。

  4. 初始化最终结果 ans 为 1,将 Pair 数组按照左边界从小到大排序。

  5. 初始化当前区间的左右边界为 p[0].x 和 p[0].y。

  6. 遍历每个区间:

    • 如果当前区间的左边界小于等于当前区间的右边界,则将当前区间的右边界更新为两者的最大值。
    • 否则,将结果 ans 加 1,并更新当前区间的左右边界。
  7. 输出结果 ans

java 复制代码
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);
        }
    }
}
相关推荐
zyq99101_122 分钟前
DFS算法实战:经典例题代码解析
python·算法·蓝桥杯·深度优先
智者知已应修善业27 分钟前
【51单片机单按键切换广告屏】2023-5-17
c++·经验分享·笔记·算法·51单片机
广州灵眸科技有限公司29 分钟前
为RK3588注入澎湃算力:RK1820 AI加速卡完整适配与评测指南
linux·网络·人工智能·物联网·算法
qinian_ztc37 分钟前
frida 14.2.18 安装报错解决
算法·leetcode·职场和发展
AI应用实战 | RE42 分钟前
012、检索器(Retrievers)核心:从向量库中智能查找信息
人工智能·算法·机器学习·langchain
凤年徐44 分钟前
C++手撕红黑树:从0到200行,拿下STL map底层核心
c++·后端·算法
Thomas.Sir1 小时前
AI 医疗之罕见病/疑难病辅助诊断系统从算法到实现【表型驱动与知识图谱推理】
人工智能·算法·ai·知识图谱
tankeven1 小时前
动态规划专题(03):区间动态规划从原理到实践(未完待续)
c++·算法·动态规划
田梓燊2 小时前
2026/4/11 leetcode 3741
数据结构·算法·leetcode
斯内科2 小时前
FFT快速傅里叶变换
算法·fft