352. Data Stream as Disjoint Intervals

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]

Follow up:

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;
};

Last updated

Was this helpful?