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].
Subscribe to see which companies asked this question
思路分析:
To check the intersections between interval [a,b] and [c,d], there are four cases (equal not shown in the figures):
a____b
c____d
a____b
c____d
a_______b
c___d
a___b
c_______d
But we can simplify these into 2 cases when check the smaller (smaller start point) interval with the bigger interval.
For the problem, the idea is simple. First sort the vector according to the start value. Second, scan every interval, if it can be merged to the previous one, then merge them, else push it into the result vector.
Note here:
The use of std::sort to sort the vector, need to define a compare function, which need to be static. (static bool myfunc() ) The sort command should be like this: std::sort(intervals.begin,intervals.end, Solution::myfunc); otherwise, it won't work properly.
/*
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].
*/
#include "stdafx.h"
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
struct Interval
{
int start;
int end;
Interval() : start(0), end(0) {}
Interval(int s, int e) : start(s), end(e) {}
};
class Solution_056_MergeIntervals
{
public:
static bool myfunc(const Interval &a, const Interval &b)
{
return (a.start < b.start);
}
vector<Interval> merge(vector<Interval> &intervals)
{
vector<Interval> res;
if (intervals.size() == 0)
{
return res;
}
sort(intervals.begin(), intervals.end(), myfunc);
res.push_back(intervals[0]);
for (int i = 1; i < intervals.size(); i++)
{
/*
a_____b
c____d
或者
a____b
c_d
*/
if (res.back().end >= intervals[i].start)
{
res.back().end = max(res.back().end, intervals[i].end);
}
/*
a____b
c____d
*/
else
{
res.push_back(intervals[i]);
}
}
return res;
}
};
本文讨论了如何在一组互不重叠的区间中插入一个新区间,并在必要时进行合并。通过排序和遍历,实现对区间的有效管理和更新。
300

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



