题解 | #奶牛喂养时间#

76 阅读2分钟

描述

在一个牧场里,有 n 头奶牛各自分布在编号为 0 到 10000 的若干个喂养时间段。每一个喂养时间段由开始时刻 start 和结束时刻 end 组成,[start, end]。现在牧场的管理员需要合并所有的重叠喂养时间区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有时间区间。给定一个数组 intervals ,表示这些喂养时间。你需要返回的是合并后的时间区间的列表。

示例1

输入:[[1, 3], [2, 6], [8, 10], [15, 18]]
返回值:[[1,6],[8,10],[15,18]]

示例2

输入:[[1, 4],[4, 5]]
返回值:[[1,5]]

备注:

  (1 <= n <= 10^4)
(0 <= start <= end <= 10000

知识点

排序,合并区间

Java题解

public class Solution {
    public int[][] mergeTimeIntervals (int[][] intervals) {
        Arrays.sort(intervals, (a, b) -> a[0] - b[0]);

        List<int[]> merged = new ArrayList<>();
        int[] currentInterval = intervals[0];
        merged.add(currentInterval);

        for (int i = 1; i < intervals.length; i++) {
            int[] interval = intervals[i];
            if (currentInterval[1] >= interval[0]) {
                currentInterval[1] = Math.max(currentInterval[1], interval[1]);
            } else {
                currentInterval = interval;
                merged.add(currentInterval);
            }
        }
        int[][] result = new int[merged.size()][2];
        for (int i = 0; i < merged.size(); i++) {
            result[i] = merged.get(i);
        }

        return result;
    }
}

解题思路

首先,对给定的区间数组 intervals 进行排序,按照区间的起始时间进行升序排序。创建一个结果集合 merged,用于存储合并后的区间。初始化一个当前区间 currentInterval,将排序后第一个区间 intervals[0] 赋值给 currentInterval,并添加到 merged 中。 从第二个区间 intervals[1] 开始遍历剩余的区间:如果当前区间的结束时间 currentInterval[1] 大于等于下一个区间的起始时间 intervals[i][0],说明发生了重叠,需要合并区间。用当前区间的结束时间 currentInterval[1] 和下一个区间的结束时间 intervals[i][1] 中的较大值来更新 currentInterval 的结束时间。如果当前区间的结束时间 currentInterval[1] 小于下一个区间的起始时间 intervals[i][0],说明没有重叠,将下一个区间添加到 merged 中,并更新 currentInterval。

遍历完所有区间后,将 merged 转换成二维数组,返回合并后的区间列表。