整体不难,一开始以为是线段树,后来仔细看来不需要,从左到右扫,判断是否要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) { // mergeableint 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;elsereturn 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;}
};