- Problem:
- 將一個新的 interval 插入到已排序且不 overlapped 的 interval list 中, 必要時進行 merge
- Solution:
- 先將 newInterval 依據 start 放到 interval list中
- 檢查 interval 是否需要 merge
/**
* Definition for an interval.
* struct Interval {
* int start;
* int end;
* Interval() : start(0), end(0) {}
* Interval(int s, int e) : start(s), end(e) {}
* };
*/
static bool isIntersec(const Interval &a, const Interval &b)
{
return max(a.start, b.start) <= min(a.end, b.end);
}
static Interval mergeInterval(const Interval &a, const Interval &b)
{
return (isIntersec(a, b))? Interval(min(a.start, b.start), max(a.end, b.end)) : Interval(0, 0);
}
class Solution {
public:
vector insert(vector& intervals, Interval newInterval) {
vector result;
// step 1. directly add newInterval into intervals first
vector::iterator it;
for (it = intervals.begin(); it < intervals.end(); it++)
{
if (newInterval.start < it->start)
{
break;
}
}
intervals.insert(it, newInterval);
// step 2. merge nearby intervals if necessary
for (size_t i = 0; i < intervals.size(); i++){
Interval merged(intervals[i].start, intervals[i].end);
while (i+1 < intervals.size() && isIntersec(merged, intervals[i+1]))
{
merged.end = max(merged.end, intervals[i+1].end);
i++;
}
result.push_back(merged);
}
return result;
}
};
沒有留言:
張貼留言