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].
方法: map存点位,开始点+1,结束点-1。遍历map,count记录当前在这个点的段的数量。
class Solution {
public:
vector<Interval> merge(vector<Interval>& intervals)
{
map<int, int> mp;
for (auto it : intervals)
{
mp[it.start] ++;
mp[it.end] --;
}
int count = 0;
vector<Interval> ret;
for (auto it : mp)
{
if (count == 0 && it.second > 0) //从无到有,加入头
{
ret.push_back(Interval(it.first, 0));
}
else if (count > 0 && it.second + count == 0) //从有到无,这一段结束
{
ret.back().end = it.first;
}
count += it.second;
}
return ret;
}
};
57. Insert Interval
Given a set of non-overlapping intervals, insert a new interval into the intervals (merge if necessary).
You may assume that the intervals were initially sorted according to their start times.
Example 1:
Given intervals [1,3],[6,9], insert and merge [2,5] in as [1,5],[6,9].
Example 2:
Given [1,2],[3,5],[6,7],[8,10],[12,16], insert and merge [4,9] in as [1,2],[3,10],[12,16].
This is because the new interval [4,9] overlaps with [3,5],[6,7],[8,10].
同上。
class Solution {
public:
vector<Interval> insert(vector<Interval>& intervals, Interval newInterval) {
map<int, int> mp;
for (auto it : intervals)
{
mp[it.start] ++;
mp[it.end] --;
}
mp[newInterval.start] ++;
mp[newInterval.end] --;
int count = 0;
intervals.clear();
for (auto it : mp)
{
if (count == 0 && it.second > 0) //从无到有,加入头
{
intervals.push_back(Interval(it.first, 0));
}
else if (count > 0 && it.second + count == 0) //从有到无,这一段结束
{
intervals.back().end = it.first;
}
count += it.second;
}
return intervals;
}
};