侧边栏壁纸
  • 累计撰写 29 篇文章
  • 累计创建 18 个标签
  • 累计收到 2 条评论

目 录CONTENT

文章目录

56. 合并区间

bsdlzg
2022-10-20 / 0 评论 / 0 点赞 / 139 阅读 / 500 字

题目如下:

  以数组 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

解题思想:

  本题的主要思想就是合并有交集范围的数组,形成一个大的新数组,加入到list中去。解题思路直接先排序给定的数据,如果list为空,说明list处于初始阶段,那么遍历数组的某一个元素,直接加入到lits中去;如果数组不为空,那么判断list最后一个元素的最大值,和遍历数据的起始值(代码中k1)比较,遍历数据的起始值大,则说明不在list最后一个元素范围之内,新建一个元素加入list。反之比较扩大list最后一个元素数据范围。具体代码如下,仅供参考。

具体代码实现

class Solution {
    public int[][] merge(int[][] intervals) {
        int N = intervals.length;
        if (N == 0) {
            return new int[0][2];
        }
        // 先排序
        Arrays.sort(intervals, new Comparator<int[]>() {
            public int compare(int[] o1, int[] o2) {
                return o1[0] - o2[0];
            }
        });
        List<int[]> merge = new ArrayList<int[]>();
        for (int i = 0; i < N; i++) {
            int k1 = intervals[i][0], k2 = intervals[i][1];
            if (merge.size() == 0 || merge.get(merge.size() - 1)[1] < k1) {
                merge.add(new int[]{k1,k2});
            } else {
                merge.get(merge.size() - 1)[1] = Math.max(merge.get(merge.size() - 1)[1],k2);
            }
        }
        return merge.toArray(new int[merge.size()][]);
    }
}
0

评论区