Leetcode 56. Merge Intervals

来源:互联网 发布:s7200plc通讯端口设置 编辑:程序博客网 时间:2024/06/18 15:46

题目

Given a collection of intervals, merge all overlapping intervals.

For example,
Given [1,3],[2,6],[8,10],[15,18],
return [1,6],[8,10],[15,18].

思路

先排序,然后按照顺序进行合并

测试用例

[[]]
[[1,3]]
[[1, 4] [0, 4]]

代码

package leetcodeArray;import java.util.ArrayList;import java.util.List;/** * Definition for an interval. * public class Interval { *     int start; *     int end; *     Interval() { start = 0; end = 0; } *     Interval(int s, int e) { start = s; end = e; } * } */public class Leetcode56MergeIntervals {    public List<Interval> merge(List<Interval> intervals) {        int N = intervals.size();        List<Interval> result = new ArrayList<Interval>();        if(N < 1){            return result;        }         intervals.sort((i1, i2)  -> Integer.compare(i1.start, i2.start));        int start = intervals.get(0).start;        int end = intervals.get(0).end;        for(int i = 0; i < N; ++i){            if(intervals.get(i).start > end){                Interval temp = new Interval(start, end);                result.add(temp);                start = intervals.get(i).start;                end = intervals.get(i).end;            }            else{                end = Math.max(end, intervals.get(i).end);            }        }        Interval temp = new Interval(start, end);        result.add(temp);        return result;    }}

结果

这里写图片描述
我的这个结果并不是很好,由于我采用了java8中的sort。后期在discussion中找到一个更好的方案,因为类的排序比数组的排序花费的时间比较多

他山之玉

public List<Interval> merge(List<Interval> intervals) {    // sort start&end    int n = intervals.size();    int[] starts = new int[n];    int[] ends = new int[n];    for (int i = 0; i < n; i++) {        starts[i] = intervals.get(i).start;        ends[i] = intervals.get(i).end;    }    Arrays.sort(starts);    Arrays.sort(ends);    // loop through    List<Interval> res = new ArrayList<Interval>();    for (int i = 0, j = 0; i < n; i++) { // j is start of interval.        if (i == n - 1 || starts[i + 1] > ends[i]) {            res.add(new Interval(starts[j], ends[i]));            j = i + 1;        }    }    return res;}
原创粉丝点击