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]
.
We can sort the intervals by start points first and then traverse the list from start and merge neighbors if possible.
C++ Code:
/* * compare function for sorting Intervals */ bool comp_func(const Interval &x, const Interval &y){ return x.start <= y.start; } /* * func: merge_interval * goal: merge all overlapping intervals * @param intervals: input interval vectors * return: interval set after merging */ /* * Sort the intervals by start points and iterate each interval * and merge them if possible * complexity: time O(nlogn), space O(1) */ vector<Interval> merge_interval(vector<Interval> &intervals){ sort(intervals.begin(), intervals.end(), comp_func); vector<Interval> results; for(const auto& it : intervals){ if(results.empty() || it.start > results.back().end){ results.emplace_back(it); } else{ auto &back = results.back(); back.end = std::max(it.end, back.end); } } return results; }
Python Code:
# func: merge overlapping intervals in the list # @param intervals: a list of intervals def merge_interval(intervals): intervals_sorted = sorted(intervals, lambda x, y: cmp(x.start, y.start)) result = [] for interval in intervals_sorted: if not result or result[-1].end < interval.start: result.append(interval) else: result[-1].end = max(result[-1].end, interval.end) return result
No comments:
Post a Comment