Leetcode56. 合并区间

181 阅读1分钟

要求:

给出一个区间的集合,请合并所有重叠的区间。

示例:

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

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

思路:

  • 前期准备工作:
  1. 输入是二维数组,先对二维数组排序,排序的依据是每个数组的左边界值的大小关系。
Arrays.sort(数组名,new Comparator<int[]>() {
    @Override
    public int compare(int[] o1, int[] o2) {
        return o1[0] - o2[0];
    }
});
  1. 对数组合并进行情况的划分,假设是o1[左,右],o2[左,右]两个
    1. o1[右]<o2[左],无法合并,直接添加o2[];
    2. o1[右]>=o2[左],合并,更新数组的右边界。
  • 需要注意的事情:
  1. 需要先对特殊情况做判断

  2. 创建一个元素内容为int[]的List用于添加元素,res

  3. 先将第一个数组添加进来

  4. 开始循环:

    1. 用一个临时数组存储当前获取的元素
    2. 用一个临时数组获取当前res中的最后一个元素
    3. 进行比较和合并
  5. 最后将res转换成一个数组,将res中的内容作为元素输入到新的数组中。

代码:

class Solution {
    public int[][] merge(int[][] intervals) {
        int len = intervals.length;
        if(len<2) return intervals;
        Arrays.sort(intervals, new Comparator<int[]>() {
            @Override
            public int compare(int[] o1, int[] o2) {
                return o1[0] - o2[0];
            }
        });
        List<int[]> res = new ArrayList<>();
        res.add(intervals[0]);
        for (int i = 1; i<len; i++) {
            int[] temp = intervals[i];
            int[] peek = res.get(res.size()-1);
            if (peek[1] < temp[0]) {
                res.add(temp);
            } else {
                peek[1] = Math.max(peek[1], temp[1]);
            }
        }
        return res.toArray(new int[res.size()][]);
    }
}