一、题目

现有若干个会议,所有会议共享一个会议室,用数组表示各个会议的开始时间和结束时间,

格式为: 
[[会议1开始时间, 会议1结束时间], [会议2开始时间, 会议2结束时间]] 

请计算会议室占用时间段。

会议室个数范围:[1, 100]
会议室时间段:[1, 24]

二、输入

第一行输入一个整数n,表示会议数量 

之后输入n行,每行两个整数,以空格分隔,分别表示会议开始时间,会议结束时间

三、输出

输出多行,每个两个整数,以空格分隔,分别表示会议室占用时间段开始和结束

四、示例

输入:
4
1 4
2 5
7 9
14 18

输出:
1 5
7 9
14 18

五、题解

区间合并问题。注意按起点排序。

5.1 Java 实现

package org.stone.study.algo.ex202411;

import java.util.*;

/**
 * 会议室安排: 合并重叠的区间
 */
public class MeetingRoom {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        // 4
        int m = scanner.nextInt();
        // 1 4
        // 2 5
        // 7 9
        // 14 18
        int[][] intervals = new int[m][2];
        for(int i = 0; i < m; i++) {
            intervals[i][0] = scanner.nextInt();
            intervals[i][1] = scanner.nextInt();
        }

        int[][] res = merge(intervals);
        // 1 5
        // 7 9
        // 14 18
        Arrays.stream(res).forEach(e -> System.out.println(e[0] + " " + e[1]));
    }

    /**
     * 合并重叠区间
     * @param intervals
     * @return
     */
    public static int[][] merge(int[][] intervals) {
        if(intervals == null || intervals.length == 0) {
            return new int[0][0];
        }
        // 按区间左端点升序排序
        Arrays.sort(intervals, Comparator.comparingInt(a -> a[0]));

        List<int[]> res = new ArrayList<>();
        int m = intervals.length;
        int[] cur = intervals[0];
        res.add(cur);
        for(int i = 1; i < m; i++) {
            int[] next = intervals[i];
            if(cur[1] >= next[0]) {
                // 合并区间
                cur[1] = Math.max(cur[1], next[1]);
            } else {
                // 不重叠,更新 cur,增加一条新的区间
                cur = next;
                res.add(cur);
            }
        }

        return res.toArray(new int[res.size()][]);
    }
}

5.2 Python实现

def merge_intervals(intervals):
    intervals.sort(key=lambda x: x[0])
    merged = []
    for interval in intervals:
        # 新增一条区间
        if not merged or merged[-1][1] < interval[0]:
            merged.append(interval)
        else:
            # 合并区间(更新上一条区间的右端点)
            merged[-1][1] = max(merged[-1][1], interval[1])
    return merged

if __name__ == "__main__":
    # 4
    m = int(input())
    # 输入 m 行,每行两个数字,表示一个区间
    # 1 3
    # 2 6
    # 8 10
    # 15 18
    intervals = [list(map(int, input().split())) for _ in range(m)]

    ans = merge_intervals(intervals)

    # 按行打印结果
    for interval in ans:
        print(interval[0], interval[1])