[leetcode]Merge Intervals

整体不难,一开始以为是线段树,后来仔细看来不需要,从左到右扫,判断是否要merge就是了。此题有几个要注意的地方:1.Java的Comparator要会写;2.循环结束后的ans.add(tmp)不要忘记;3.merge的时候,左右边界要计算一下。

/**
 * 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 ArrayList<Interval> merge(ArrayList<Interval> intervals) {
        // Start typing your Java solution below
        // DO NOT write main() function              
        int len = intervals.size();
        if (len == 0 || len == 1) return intervals;
        ArrayList<Interval> ans = new ArrayList<Interval>();
        
        Collections.sort(intervals, new IntervalComparator());
        
        Interval tmp = intervals.get(0);
        for (int i = 1; i < len; i++) {
            Interval itv = intervals.get(i);
            if (tmp.end >= itv.start) { // mergeable
                int left = Math.min(tmp.start, itv.start);
                int right = Math.max(tmp.end, itv.end);
                tmp = new Interval(left, right);
            }
            else {
                ans.add(tmp);
                tmp = intervals.get(i);
            }
        }
        ans.add(tmp);
        return ans;
    }
}

class IntervalComparator implements Comparator<Interval>
{
    public int compare(Interval a, Interval b) {
        return a.start - b.start;
    }
}

第二刷:

bool cmp(const Interval &a, const Interval &b)
{
    if (a.start != b.start)
        return a.start < b.start;
    else
        return a.end < b.end;
}

class Solution {
public:
    vector<Interval> merge(vector<Interval> &intervals) {
        vector<Interval> result;
        sort(intervals.begin(),intervals.end(), cmp);
        for (int i = 0; i < intervals.size(); i++)
        {
            if (result.size() == 0 || result.back().end < intervals[i].start)
            {
                result.push_back(intervals[i]);
            }
            else if (intervals[i].end > result.back().end)
            {
                result.back().end = intervals[i].end;
            }
        }
        return result;
    }
};

python3,另一种做法是排序各个点

class Solution:
    def merge(self, intervals: List[List[int]]) -> List[List[int]]:
        points = []
        for interval in intervals:
            points.append((interval[0], -1))
            points.append((interval[1], 1))
            
        points = sorted(points)
        
        result = []
        cnt = 0
        begin = 0
        end = 0
        for point in points:
            cnt += point[1]
            if cnt == -1 and point[1] == -1: # begin
                begin = point[0]
            if cnt == 0 and point[1] == 1: # end
                end = point[0]
                result.append([begin, end])
                
        return result

  

posted @ 2013-08-12 22:55  阿牧遥  阅读(1242)  评论(0编辑  收藏  举报