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].
The basic idea is to sort the intervals increasingly based on the .start value. Then, merge them one by one until merge fails.
static bool sorter(Interval start, Interval end) {
return start.start < end.start;
}
static bool merge(Interval& v1, Interval& v2, Interval& res) {
if(v1.end < v2.start) return false;
res.start = v1.start;
res.end = max(v1.end, v2.end);
return true;
}
vector<Interval> merge(vector<Interval>& intervals) {
if(intervals.size() == 0) return {};
sort(intervals.begin(), intervals.end(), sorter);
vector<Interval> res;
res.push_back(intervals[0]);
Interval tmp;
for(int i = 1; i < intervals.size(); ++i) {
if(merge(res.back(), intervals[i], tmp)) {
res.back() = tmp;
} else {
res.push_back(intervals[i]);
}
}
return res;
}Do it in-place, using two pointers.
static bool sorter(Interval a, Interval b) {
return a.start <= b.start;
}
void mergeInterval(vector<Interval>& nums) {
if(nums.size() <= 1) return;
int index = 0;
sort(nums.begin(), nums.end(), sorter);
for(int i = 0; i < nums.size(); ++i) {
if(index != 0 && nums[index - 1].end >= nums[i].start) {
while(index != 0 && nums[index-1].end >= nums[i].start) {
nums[index-1].start = min(nums[index-1].start, nums[i].start);
nums[index-1].end = max(nums[index-1].end, nums[i].end);
index--;
}
} else {
nums[index] = nums[i];
}
index++;
}
}
本文介绍了一种有效的合并区间算法,该算法首先将输入的区间按起始值进行排序,然后通过迭代的方式合并所有重叠的区间。具体实现包括两种方法:一种使用额外的空间存储结果,另一种则采用原地修改的方式,利用双指针技术完成合并。
529

被折叠的 条评论
为什么被折叠?



