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]
.
Great problem from which i learn a lot.
My previous answer is always TLE, finally i got the mistake from a coder online.
This is my previous answer:
bool cmp(Interval a, 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) {
if (intervals.size() < 2) return intervals;
sort(intervals.begin(), intervals.end(), cmp);
vector<Interval>::iterator iter;
iter = intervals.begin();
for (int i = 0; i < intervals.size() - 1; ) {
if (intervals[i + 1].start <= intervals[i].end) {
intervals[i + 1].start = intervals[i].start;
if (intervals[i + 1].end < intervals[i].end) intervals[i + 1].end = intervals[i].end;
intervals.erase(iter);
} else {
i++;
iter++;
}
}
return intervals;
}
};
Notice that erase function is so slow...
So I change my mind to use a new vector to store the answer and finally intervals = answer.
And it is accepted.
bool cmp(Interval a, 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) {
if (intervals.size() < 2) return intervals;
sort(intervals.begin(), intervals.end(), cmp);
intervals.push_back(Interval(99999999, 99999999 + 1));
vector<Interval> ans;
for (int i = 0; i < intervals.size() - 1; i++) {
if (intervals[i + 1].start <= intervals[i].end) {
intervals[i + 1].start = intervals[i].start;
if (intervals[i + 1].end < intervals[i].end) intervals[i + 1].end = intervals[i].end;
} else {
ans.push_back(intervals[i]);
}
}
intervals = ans;
return intervals;
}
};