56. Merge Intervals
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].
思路
本题要合并重叠的区间,对于区间[start1, end1]和[start2, end2],如果start1 <= start2,则当end1 >= start2时区间重叠,可以合并为[start1, max(end1,end2)];否则,两个区间不重叠。
因此问题的难点在于选择依据区间的起始端点对区间进行排序,在本题中,区间和输入参数分别为:
struct Interval { int start; int end; Interval() : start(0), end(0) {} Interval(int s, int e) : start(s), end(e) {} }; vector<Interval> merge(vector<Interval>& intervals) {}
输入的区间集合的存储方式是vector<Interval>,如何对该vector进行排序呢?
考虑使用STL的排序算法sort,但是要定制仿函数,作为第三个参数传入sort()中。
class Solution { public: vector<Interval> merge(vector<Interval>& intervals) { int n = intervals.size(); if (n <= 1) return intervals; sort(intervals.begin(), intervals.end(), [](const Interval& lhs, const Interval& rhs) -> bool {return lhs.start < rhs.start;}); int i = 0; int j = 1; while (j < n) { if (intervals[i].end >= intervals[j].start) { intervals[i].end = std::max(intervals[i].end, intervals[j].end); ++j; } else { ++i; intervals[i].start = intervals[j].start; intervals[i].end = intervals[j].end; ++j; } } intervals.erase(intervals.begin() + i + 1, intervals.end()); return intervals; } };
浙公网安备 33010602011771号