Leetcode 352 Solution

This article provides solution to leetcode question 352 (data-stream-as-disjoint-intervals)

https://leetcode.com/problems/data-stream-as-disjoint-intervals

Solution

/**
 * Definition for an interval.
 * struct Interval {
 *     int start;
 *     int end;
 *     Interval() : start(0), end(0) {}
 *     Interval(int s, int e) : start(s), end(e) {}
 * };
 */

struct Interval_comparator
{
    bool operator() (const Interval& i1, const Interval& i2)
    {
        return i1.start < i2.start || (i1.start == i2.start && i1.end < i2.end);
    }
};

class SummaryRanges {
    set<Interval, Interval_comparator> intervals;

public:
    /** Initialize your data structure here. */
    SummaryRanges() {
    }

    void addNum(int val) {
        auto it = intervals.find(Interval(val, val));
        if (it != intervals.end())
            return;

        intervals.insert(Interval(val, val));
        it = intervals.find(Interval(val, val));

        if (it != intervals.begin())
        {
            auto left_it = it;
            left_it--;

            if (left_it->end + 1 == it->start)
            {
                int new_start = left_it->start;
                int new_end = it->end;
                intervals.erase(left_it);
                intervals.erase(it);
                intervals.insert(Interval(new_start, new_end));
                it = intervals.find(Interval(new_start, new_end));
            }
            else if (left_it->end >= it->start)
            {
                intervals.erase(it);
                return;
            }
        }

        auto right_it = it;
        right_it++;

        if (right_it != intervals.end())
        {
            if (right_it->start == it->end + 1)
            {
                int new_start = it->start;
                int new_end = right_it->end;
                intervals.erase(right_it);
                intervals.erase(it);
                intervals.insert(Interval(new_start, new_end));
                it = intervals.find(Interval(new_start, new_end));
            }
            else if (right_it->start <= it->end)
            {
                intervals.erase(it);
                return;
            }
        }
    }

    vector<Interval> getIntervals() {
        vector<Interval> res;

        for (auto interval : intervals)
            res.push_back(interval);

        return res;
    }
};

/**
 * Your SummaryRanges object will be instantiated and called as such:
 * SummaryRanges obj = new SummaryRanges();
 * obj.addNum(val);
 * vector<Interval> param_2 = obj.getIntervals();
 */