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