Given a data stream input of non-negative integers a1, a2, ..., an, ..., summarize the numbers seen so far as a list of disjoint intervals.
For example, suppose the integers from the data stream are 1, 3, 7, 2, 6, ..., then the summary will be:
[1, 1]
[1, 1], [3, 3]
[1, 1], [3, 3], [7, 7]
[1, 3], [7, 7]
[1, 3], [6, 7]
What if there are lots of merges and the number of disjoint intervals are small compared to the data stream's size?
class SummaryRanges {
public:
/** Initialize your data structure here. */
SummaryRanges() {
}
void addNum(int val) { // time: O(n)
vector<int> new_interval({val, val});
int i = 0, overlap = 0, n = intervals.size();
while (i < n) {
if (new_interval[1] + 1 < intervals[i][0]) break;
if (new_interval[0] <= intervals[i][1] + 1) {
new_interval[0] = min(new_interval[0], intervals[i][0]);
new_interval[1] = max(new_interval[1], intervals[i][1]);
++overlap;
}
++i;
}
if (overlap > 0) {
intervals.erase(intervals.begin() + i - overlap, intervals.begin() + i);
}
intervals.insert(intervals.begin() + i - overlap, new_interval);
}
vector<vector<int>> getIntervals() {
return intervals;
}
private:
vector<vector<int> > intervals;
};