Leetcode - Merge Intervals

Given a collection of intervals, merge all overlapping intervals.

[分析] 这题思路不难,将输入的区间数组按左边界排序然后合并。但是调试了很久,好处是熟悉了些Java语法。首先,忘记对ArrayList排序可以使用Collections.sort(),不厌其烦地在ArrayList和数组间转换为了能使用Arrays.sort进行排序;然后使用Iterator对Arrays.asList()转化得到的ArrayList进行删除操作时遭遇了java.lang.UnsupportedOperationException, Google上查了一番并查看相应实现知道通过Arrays.asList()获取到的List并不支持add和remove等修改操作,该List对象是在Arrays中实现的一个内部类ArrayList,继承AbstractList且没有重载AbstractList的add 和remove方法。一番修改后又撞上了java.lang.IllegalArgumentException: Comparison method violates its general contract!说我的Comparator实现得不对,不满足比较的基本性质,一查发现是有个手误。不断优化得到三个版本。

public class Solution {
    Comparator<Interval> comparator = new Comparator<Interval>() {
        public int compare(Interval inter1, Interval inter2) {
            if (inter1.start > inter2.start) return 1;
            else if (inter1.start < inter2.start) return -1;
            else if (inter1.end < inter2.end) return -1;
            else if (inter1.end > inter2.end) return 1;
            else return 0;
        }
    };
    
    // Method 3: merge结果存储在额外List中, Method 2 的代码优化版
    public List<Interval> merge(List<Interval> intervals) {
        if (intervals == null || intervals.size() <= 1)
            return intervals;
        Collections.sort(intervals, comparator);
        List<Interval> result = new ArrayList<Interval>();
        int i = 0, N = intervals.size();
        while (i < N) {
            result.add(intervals.get(i++));
            Interval last = result.get(result.size() - 1);
            while (i < N && intervals.get(i).start <= last.end) {
                last.end = Math.max(last.end, intervals.get(i++).end);
            }
        }
        return result;
    }
    
    // Method 2: merge结果存储在额外List中
    public List<Interval> merge2(List<Interval> intervals) {
        if (intervals == null || intervals.size() <= 1)
            return intervals;
        Collections.sort(intervals, comparator);
        List<Interval> result = new ArrayList<Interval>();
        result.add(intervals.get(0));
        int i = 1;
        while (i < intervals.size()) {
            int currEnd = result.get(result.size() - 1).end;
            while (i < intervals.size() && currEnd >= intervals.get(i).end) {
                i++;
            }
            if (i == intervals.size()) break;
            if (intervals.get(i).start > currEnd)
                result.add(intervals.get(i));
            else
                result.get(result.size() - 1).end = intervals.get(i).end;
            i++;
        }
        return result;
    }
    
    // Method 1: 在原数组中merge
    public List<Interval> merge1(List<Interval> intervals) {
        if (intervals == null || intervals.size() <= 1)
            return intervals;
        Collections.sort(intervals, comparator);
        Iterator<Interval> iter = intervals.iterator();
        Interval curr = iter.next();
        while (iter.hasNext()) {
            Interval next = iter.next();
            if (next. start <= curr.end) {
               if (next.end > curr.end) {
                    curr.end = next.end;
                } 
                iter.remove();
            } else {
                curr = next;
            }
        }
        return intervals;
    }
}

你可能感兴趣的:(LeetCode)