1. Runtime Distribution
2. Submission Details
3. Description
Given a data stream input of non-negative integers a1, a2, ..., an, ..., summarize the numbers seen so far as a list of disjoint intervals.
4. 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]
5. Code
[restabs alignment="osc-tabs-right" responsive="true" icon="true" text="More" seltabcolor="#fdfdfd" seltabheadcolor="#000" tabheadcolor="blue"]
[restab title="Java" active="active"]
Listintervals; public SummaryRanges() { intervals = new ArrayList (); } public void addNum(int val) { int pos = binarySearch(val); if (pos < 0) { if (intervals.size() > 0 && val == intervals.get(0).start - 1) { intervals.get(0).start = val; } else { intervals.add(0, new Interval(val, val)); } } else { if (val == intervals.get(pos).end + 1) { intervals.get(pos).end = val; } else if (val > intervals.get(pos).end + 1) { intervals.add(pos + 1, new Interval(val, val)); pos++; } if (pos + 1 < intervals.size() && intervals.get(pos).end + 1 == intervals.get(pos + 1).start) { intervals.get(pos).end = intervals.get(pos + 1).end; intervals.remove(pos + 1); } } } public int binarySearch(int n) { int end = intervals.size() - 1; if (end < 0) { return -1; } int start = 0; int mid = 0; while (start <= end) { mid = ((end - start) >> 1) + start; if (n < intervals.get(mid).start) { end = mid - 1; } else { start = mid + 1; } } return end; } public List getIntervals() { return intervals; }
[/restab]
[restab title="Java TreeMap"]
TreeMaptreeMap; public SummaryRanges() { treeMap = new TreeMap<>(); } public void addNum(int val) { if (treeMap.containsKey(val)) { return; } Integer left = treeMap.lowerKey(val); Integer right = treeMap.higherKey(val); if (left != null && right != null && treeMap.get(left).end + 1 == val && val + 1 == right) { treeMap.get(left).end = treeMap.get(right).end; treeMap.remove(right); } else if (right != null && val + 1 == right) { treeMap.put(val, new Interval(val, treeMap.get(right).end)); treeMap.remove(right); } else if (left != null && treeMap.get(left).end + 1 >= val) { treeMap.get(left).end = Math.max(treeMap.get(left).end, val); } else { treeMap.put(val, new Interval(val, val)); } } public List getIntervals() { return new ArrayList<>(treeMap.values()); }
[/restab]
[/restabs]
6.Test
[restabs alignment="osc-tabs-right" responsive="true" icon="true" text="More" seltabcolor="#fdfdfd" seltabheadcolor="#000" tabheadcolor="blue"]
[restab title="Java" active="active" ]
import java.util.ArrayList; import java.util.List; public class LeetCode0352 { class Interval { int start; int end; Interval() { start = 0; end = 0; } Interval(int s, int e) { start = s; end = e; } } Listintervals; public LeetCode0352() { intervals = new ArrayList (); } public void addNum(int val) { int pos = binarySearch(val); if (pos < 0) { if (intervals.size() > 0 && val == intervals.get(0).start - 1) { intervals.get(0).start = val; } else { intervals.add(0, new Interval(val, val)); } } else { if (val == intervals.get(pos).end + 1) { intervals.get(pos).end = val; } else if (val > intervals.get(pos).end + 1) { intervals.add(pos + 1, new Interval(val, val)); pos++; } if (pos + 1 < intervals.size() && intervals.get(pos).end + 1 == intervals.get(pos + 1).start) { intervals.get(pos).end = intervals.get(pos + 1).end; intervals.remove(pos + 1); } } } public int binarySearch(int n) { int end = intervals.size() - 1; if (end < 0) { return -1; } int start = 0; int mid = 0; while (start <= end) { mid = ((end - start) >> 1) + start; if (n < intervals.get(mid).start) { end = mid - 1; } else { start = mid + 1; } } return end; } public List getIntervals() { return intervals; } }
[/restab]
[restab title="Java TreeMap"]
import java.util.ArrayList; import java.util.List; import java.util.TreeMap; public class LeetCode0352 { class Interval { int start; int end; Interval() { start = 0; end = 0; } Interval(int s, int e) { start = s; end = e; } } TreeMaptreeMap; public LeetCode0352() { treeMap = new TreeMap<>(); } public void addNum(int val) { if (treeMap.containsKey(val)) { return; } Integer left = treeMap.lowerKey(val); Integer right = treeMap.higherKey(val); if (left != null && right != null && treeMap.get(left).end + 1 == val && val + 1 == right) { treeMap.get(left).end = treeMap.get(right).end; treeMap.remove(right); } else if (right != null && val + 1 == right) { treeMap.put(val, new Interval(val, treeMap.get(right).end)); treeMap.remove(right); } else if (left != null && treeMap.get(left).end + 1 >= val) { treeMap.get(left).end = Math.max(treeMap.get(left).end, val); } else { treeMap.put(val, new Interval(val, val)); } } public List getIntervals() { return new ArrayList<>(treeMap.values()); } }
[/restab]
[/restabs]
Comments | NOTHING