leetcode-56. Merge Intervals

来源:互联网 发布:淘宝新手如何找货源 编辑:程序博客网 时间:2024/05/18 12:29

leetcode-56. Merge Intervals

题目:

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

刚做这题的时候脑子抽风了,不知道为什么从后往前遍历,实际上这样稍微麻烦一些。直接从前往后就行。
这题的基本思路就是先按照start或者end排序,然后再分情况讨论相邻的interval的end或者start大小就行。

/** * 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) {        Collections.sort(intervals,new Comparator<Interval>(){            @Override            public int compare(Interval v1, Interval v2){                if(v1.end==v2.end)                    return v1.start-v2.start;                return v1.end-v2.end;            }            });/*        for(Interval I : intervals){            System.out.println(I.start+" "+I.end);        }*/        for(int i = intervals.size()-1 ; i > 0 ;i--){            // System.out.println(i+" "+intervals.get(i).start+" "+intervals.get(i).end);            if(intervals.get(i-1).start>intervals.get(i).start)                intervals.remove(i-1);            else{                if(intervals.get(i-1).end>=intervals.get(i).start){                    intervals.get(i).start=intervals.get(i-1).start;                    intervals.remove(i-1);                }            }        }        return intervals;    }}

贴一个正常思路的:
答案来源

/** * 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.size() <= 1)            return intervals;        // Sort by ascending starting point using an anonymous Comparator        Collections.sort(intervals, new Comparator<Interval>() {            @Override            public int compare(Interval i1, Interval i2) {                return Integer.compare(i1.start, i2.start);            }        });        List<Interval> result = new LinkedList<Interval>();        int start = intervals.get(0).start;        int end = intervals.get(0).end;        for (Interval interval : intervals) {            if (interval.start <= end) // Overlapping intervals, move the end if needed                end = Math.max(end, interval.end);            else {                     // Disjoint intervals, add the previous one and reset bounds                result.add(new Interval(start, end));                start = interval.start;                end = interval.end;            }        }        // Add the last interval        result.add(new Interval(start, end));        return result;    }}
0 0