題目:
Given a data stream input of non-negative integers a1, a2, ..., an, ..., summarize the numbers seen so far as a list of disjoint intervals.java
For example, suppose the integers from the data stream are 1, 3, 7, 2, 6, ..., then the summary will be:code
[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?rem
解答:
這題用Maptree會經過map.lowerKey, map.higherKey很快定位到當前數所處在哪兩個interval之間,從而進行高效的比較與合併。get
/** * 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; } * } */ public class SummaryRanges { TreeMap<Integer, Interval> map; /** Initialize your data structure here. */ public SummaryRanges() { map = new TreeMap<>(); } public void addNum(int val) { if (map.containsKey(val)) return; Integer l = map.lowerKey(val); Integer h = map.higherKey(val); if (l != null && h != null && map.get(l).end + 1 == val && val + 1 == map.get(h).start) { map.get(l).end = map.get(h).end; map.remove(h); } else if (l != null && val <= map.get(l).end + 1) { map.get(l).end = Math.max(map.get(l).end, val); } else if (h != null && map.get(h).start - 1 == val) { map.put(val, new Interval(val, map.get(h).end)); map.remove(h); } else { map.put(val, new Interval(val, val)); } } public List<Interval> getIntervals() { return new ArrayList<Interval>(map.values()); } } /** * Your SummaryRanges object will be instantiated and called as such: * SummaryRanges obj = new SummaryRanges(); * obj.addNum(val); * List<Interval> param_2 = obj.getIntervals(); */