56. Merge Intervals

来源:互联网 发布:c语言必读书籍 编辑:程序博客网 时间:2024/05/18 12:42

题目摘要
给定一组区间集合,返回合并后的区间。
例如,
给定[1,3],[2,6],[8,10],[15,18],
返回[1,6],[8,10],[15,18].

解法
1. 将给定列表按区间开头进行排序(可以用匿名内部类new Comparator实现继承Comparator的效果),然后根据区间结尾的情况合并
2. 把区间开头和结尾分别存到一个数组里,分别排序,然后合并区间(这一步步骤和第一个方法后面步骤一样)<快得多>

注意
1. 用匿名内部类实现和继承Comparator接口一样的效果
2. 方法二的原理:先看前两个区间,再把前两个区间看作整体,看它和第三个区间

可问问题

原题
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].

Solution#1

public List<Interval> merge(List<Interval> intervals) {    if (intervals == null || intervals.isEmpty())        return intervals;    Collections.sort(intervals, new Comparator<Interval>() {        public int compare(Interval i1, Interval i2) {            if (i1.start != i2.start) {                return i1.start - i2.start;            }            return i1.end - i2.end;        }    });    ListIterator<Interval> it = intervals.listIterator();    Interval cur = it.next();    while (it.hasNext()) {        Interval next = it.next();        if (cur.end < next.start) {            cur = next;            continue;        } else {            cur.end = Math.max(cur.end, next.end);            it.remove();        }    }    return intervals;}

Solution#2

/** * 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 Solution {    public List<Interval> merge(List<Interval> intervals) {        if (intervals == null || intervals.size() <=1)            return intervals;        int n = intervals.size();        int[] beginArr = new int[n];        int[] endArr = new int[n];        for (int i = 0; i < n; i++) {            beginArr[i] = intervals.get(i).start;            endArr[i] = intervals.get(i).end;        }        Arrays.sort(beginArr);        Arrays.sort(endArr);        int begin = beginArr[0];        int end = endArr[0];        List<Interval> result = new LinkedList<Interval>();        for (int i = 1; i < n; i++) {            if (beginArr[i] <= endArr[i - 1]) {                end = endArr[i];            } else {                result.add(new Interval(begin, end));                begin = beginArr[i];                end = endArr[i];            }        }        result.add(new Interval(begin, end));        return result;    }}
0 0
原创粉丝点击