LeetCode(56):合并区间 Merge Intervals(Java)

2019.5.30 #程序员笔试必备# LeetCode 从零单刷个人笔记整理(持续更新)

观察什么时候可以合并区间,例如对于a=[1,3],b=[2,6]的情况下,当且仅当a[1]>b[0]且a[1]b[1],则会发生完全覆盖的情况,如a=[1,4],b=[2,3])

因此,只需要先对数组进行排序,再依次合并重叠区间即可。


传送门:合并区间

Given a collection of intervals, merge all overlapping intervals.

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

示例 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] 可被视为重叠区间。


import java.util.*;

/**
 * Given a collection of intervals, merge all overlapping intervals.
 * 给出一个区间的集合,请合并所有重叠的区间。
 */

public class MergeIntervals {
    public int[][] merge(int[][] intervals) {
        if (intervals.length < 2 || intervals[0].length == 0) {
            return intervals;
        }
        //按数组头元素升序排序(lambda表达式排序是真的慢)
        //Arrays.sort(intervals, (a, b) -> a[0] - b[0]);
        Arrays.sort(intervals, new Comparator<int[]>() {
            @Override
            public int compare(int[] o1, int[] o2) {
                return o1[0] - o2[0];
            }
        });

        ArrayList<int[]> itvs = new ArrayList<>();
        for (int i = 0; i < intervals.length - 1; i++) {
            //寻找重叠区间
            if (intervals[i][1] >= intervals[i + 1][0]) {
                //排除完全重叠区间,如[1,4]与[2,3]
                intervals[i + 1][0] = intervals[i][0];
                intervals[i + 1][1] = intervals[i][1] > intervals[i + 1][1] ? intervals[i][1] : intervals[i + 1][1];
            } else {
                itvs.add(intervals[i]);
            }
        }
        itvs.add(intervals[intervals.length - 1]);
        return itvs.toArray(new int[0][]);
    }

    //输入输出不同版本
    public class Interval {
        int start;
        int end;
        Interval() {
            start = 0;
            end = 0;
        }
        Interval(int s, int e) {
            start = s;
            end = e;
        }
    }

    public ArrayList<Interval> merge(ArrayList<Interval> intervals) {
        Collections.sort(intervals, (a, b) -> a.start - b.start);

        LinkedList<Interval> merged = new LinkedList<Interval>();
        for (Interval interval : intervals) {
            if (merged.isEmpty() || merged.getLast().end < interval.start) {
                merged.add(interval);
            }
            else {
                merged.getLast().end = Math.max(merged.getLast().end, interval.end);
            }
        }
        ArrayList<Interval> result = new ArrayList<>();
        result.addAll(merged);
        return result;
    }
}



#Coding一小时,Copying一秒钟。留个言点个赞呗,谢谢你#

你可能感兴趣的:(数据结构与算法,JAVA,LeetCode)