題目鏈接: https://leetcode.com/problems/insert-interval/description/
Description
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]
.
解題思路
題意大致爲在一個已經排序過的相互無交集的區間數組中,添加一個新的區間,將有交集的區間全部合併成一個新的區間。
題目不是很難,注意下細節就可以了。遍歷初始區間數組,對每一個區間判斷與目標區間是否有交集,交集的判定可以歸結爲三種,兩種括號表示兩個不同的區間
(---<--)--->
<---(-->---)
<---(--)--->
有交集的區間個數可以通過另一個迭代器來記錄,每發現一個區間有交集迭代器就加一,直到無交集或者到達數組末尾爲止,刪除該數組區間,再在此位置插入新的區間。
另外,還要考慮新區間與原來數組中的區間都沒有交集的情況。通過比較新區間的 end
是否小於該輪第一個區間的 start
來判斷是否有交集,涵蓋了每個原數組區間前面的空隙,不包括最後一個區間後面的間隙,因此還要單獨比較新區間 start
和原數組中最後一個區間的 end
。
Code
class Solution {
public:
vector<Interval> insert(vector<Interval> &intervals, Interval newInterval) {
if (intervals.empty()) {
intervals.push_back(newInterval);
} else {
for (auto it = intervals.begin(); it != intervals.end(); ++it) {
auto eit = it;
int start = newInterval.start;
int end = newInterval.end;
while (eit != intervals.end()) {
if ((start <= eit->end && start >= eit->start) ||
(end >= eit->start && end <= eit->end) ||
(start <= eit->start && end >= eit->end)) {
start = min(start, eit->start);
end = max(end, eit->end);
eit++;
} else {
break;
}
};
if (eit != it || end < it->start) {
it = intervals.erase(it, eit);
intervals.insert(it, Interval(start, end));
break;
} else if (it + 1 == intervals.end() && start > it->end) {
intervals.insert(it + 1, Interval(start, end));
break;
}
}
}
return intervals;
}
};