【算法】【线性表】【数组】合并区间

1  题目

以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。

示例 1:

输入:intervals = [[1,3],[2,6],[8,10],[15,18]]
输出:[[1,6],[8,10],[15,18]]
解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].

示例 2:

输入:intervals = [[1,4],[4,5]]
输出:[[1,5]]
解释:区间 [1,4] 和 [4,5] 可被视为重叠区间。

提示:

  • 1 <= intervals.length <= 104
  • intervals[i].length == 2
  • 0 <= starti <= endi <= 104

2  解答

 

class Solution {
    public int[][] merge(int[][] intervals) {
        // 参数边界校验
        if (intervals == null || intervals.length <= 0) {
            return intervals;
        }
        // 对数组按左坐标进行升序排序
        Arrays.sort(intervals, Comparator.comparingInt(o -> o[0]));
        // 定义返回结果
        List<int[]> res = new ArrayList<>();
        // 根据每个元素的右坐标以及下一个元素的区间进行比较判断逐个遍历
        for (int i = 0; i < intervals.length; ) {
            int left = intervals[i][0];
            int right = intervals[i][1];
            int j = i + 1;
            // 如果是最后一个元素了,不需要合并了,直接加入结果结束
            if (j == intervals.length) {
                res.add(new int[]{left, right});
                break;
            }
            // 寻找 i 元素可以向后合并的元素
            for (; j < intervals.length; j++) {
                int innerLeft = intervals[j][0];
                int innerRight = intervals[j][1];
                // 在下一个元素的区间内,然后继续向后遍历
                if (innerLeft <= right && right <= innerRight) {
                    right = innerRight;
                    continue;
                }
                // 包含了下一个区间的也继续向后,比如 [1,4] [2,3]
                if (right >= innerRight) {
                    continue;
                }
                break;
            }
            // 说明不在下一个区间了,说明算是一种结果了
            i = j;
            res.add(new int[]{left, right});
        }
        return res.toArray(new int[res.size()][]); 
    }
}

 

加油。

 

posted @ 2024-02-18 02:25  酷酷-  阅读(11)  评论(0编辑  收藏  举报