LeetCode刷题笔记 56

题目:合并区间
给出一个区间的集合,请合并所有重叠的区间。
示例 1:
输入: [[1,3],[2,6],[8,10],[15,18]]
输出: [[1,6],[8,10],[15,18]]
解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].
示例 2:
输入: [[1,4],[4,5]]
输出: [[1,5]]
解释: 区间 [1,4] 和 [4,5] 可被视为重叠区间。

答案:
排序+一次扫描
1.特判,若intervalsintervals为空,返回[][]。
2.定义数组长度n,当前合并区间[left,right],初始化:left=intervals[0][0],right=intervals[0][1]
3.将intervals,按照左界进行排序。
4.从第二个区间开始遍历:
(1)若下一区间intervals[i]的左界小于等于当前合并区间的右界,即intervals[i][0]<=right,表示有公共部分。此时,若满足intervals[i]的右界大于当前合并区间的右界,即intervals[i][1]>right,表示intervals[i]不包含于当前合并区间,需要更新当前合并区间的右界right=intervals[i][1]。(左界已经排好序)
(2)若下一区间intervals[i]的左界大于当前合并区间的右界,说明没有交集。将当前合并区间[left,right]加入res。更新当前合并区间左界和右界,指向下一区间,即left=intervals[i][0],right=intervals[i][1]。
5.将最后一个合并区间加入res。
6.返回res。

class Solution {
    public int[][] merge(int[][] intervals) {
        List<int[]> res = new ArrayList<>();
        if (intervals.length == 0 || intervals == null) return res.toArray(new int[0][]);
        Arrays.sort(intervals, (a, b) -> a[0] - b[0]); 
        int i = 0;
        while (i < intervals.length) {
            int left = intervals[i][0];
            int right = intervals[i][1];
            while (i < intervals.length - 1 && intervals[i + 1][0] <= right) {
                i++;
                right = Math.max(right, intervals[i][1]);
            }
            res.add(new int[]{left, right});
            i++;
        }
        return res.toArray(new int[0][]); //返回形式:[[1, 6], [8, 10], [15, 18]]
    }
}

需要知道:
1.Arrays.sort(T[] a, Comparator c)用Comparator接口实现自定义排序规则
2.Lambda表达式
(parameters) -> expression 或 (parameters) ->{ statements; }
eg:接受2个参数(数字),并返回他们的差值 (x, y) -> x – y

你可能感兴趣的:(LeetCode)