这道题仍然考察的是特殊的数据结构。

这个 Interval 本质上就是一个 std::pair.

最初的序列保证有序,那么查找 newInterval 将会很快(类似二分查找即可)。找首部的时候,根据 start,找尾部的时候,根据 end.

若 newInterval 的 start 落在了某个 interval 之间,那么修改 start, 并从该 interval 处开始删除。

同理 end 落在了某个 interval 之间,那么修改 end, 并从上面开始处一直删除到该 interval.

修改好 start 和 end, 并删除重复区域后,直接插入即可。

若没有落在任何 interval 之间,那么也是直接插入。

思路很简单,我偷懒直接用了 std::lower_bound 算法。

#include <vector>
using std::vector;
#include <algorithm>

struct Interval {
    int start;
    int end;
    Interval() : start(0), end(0) {}
    Interval(int s, int e) : start(s), end(e) {}
};

class Solution {
public:
    vector<Interval> insert(vector<Interval> &intervals, Interval newInterval) {
        auto low = std::lower_bound(intervals.cbegin(), intervals.cend(), newInterval, [](const Interval& lhs, const Interval& rhs){
            return lhs.start < rhs.start;
        });
        if (low != intervals.cbegin() && std::prev(low)->end >= newInterval.start) { --low; newInterval.start = low->start; }
        auto up = std::lower_bound(intervals.cbegin(), intervals.cend(), newInterval, [](const Interval& lhs, const Interval& rhs){
            return lhs.end < rhs.end;
        });
        if (up != intervals.cend() && up->start <= newInterval.end) { newInterval.end = up->end; ++up; }
        auto insert_pos = intervals.erase(low, up);
        intervals.insert(insert_pos, newInterval);
        return intervals;
    }
};

LeetCode Direct Link