56. 合并区间

2024/4/18 算法

题目链接:56. 合并区间 (opens new window)

这题思路很简单,感觉没什么说的,模拟即可,顺带复习Comparator构建。先对区间排序,然后维护一个left和right边界。代码如下:

class Solution {
    public int[][] merge(int[][] intervals) {
        List<int[]> merged = new ArrayList<int[]>();
        //array1[0] < array2[0]时返回负数,优先级array1[0] < array2[0],所以这里排序是按左边界从小到大
        Arrays.sort(intervals, new Comparator<int[]>() {
            public int compare(int[] array1, int[] array2) {
                return array1[0] != array2[0] ? array1[0] - array2[0] : array1[1] - array2[1];
            }
        });
        int left = intervals[0][0], right = intervals[0][1];
        for (int i = 0; i < intervals.length; i++) {
            //左边界与当前右边界重合,而且右边界比当前右边界更长
            if (intervals[i][0] <= right && intervals[i][1] > right) {
                right = intervals[i][1];
            }
            //左边界与当前右边界不重合,把当前区间添加进结果,然后开启一个新区间
            if (intervals[i][0] > right) {
                merged.add(new int[] { left, right });
                left = intervals[i][0];
                right = intervals[i][1];
            }
        }
        merged.add(new int[] { left, right });//区间遍历完了还需要一次添加
        return merged.toArray(new int[merged.size()][]);
    }
}
``