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?
/** * Definition for an interval. * public class Interval { * int start; * int end; * Interval() { start = 0; end = 0; } * Interval(int s, int e) { start = s; end = e; } * } */ class SummaryRanges { /** Initialize your data structure here. */ TreeSet<Interval> set; public SummaryRanges() { Comparator<Interval> com = new Comparator<Interval>() { public int compare(Interval a, Interval b) { return a.start - b.start; } }; set = new TreeSet(com); } public void addNum(int val) { Interval cur = new Interval(val, val); Interval pre = set.floor(cur); Interval next = set.ceiling(cur); if((pre != null && (pre.end >= val)) || (next != null && (next.start <= val))) { return; } if (pre != null && pre.end == val - 1) { set.remove(pre); cur.start = pre.start; } if (next != null && next.start == val + 1) { set.remove(next); cur.end = next.end; } set.add(cur); } public List<Interval> getIntervals() { return new ArrayList<Interval>(set); } }