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(); */