Skip to content

Instantly share code, notes, and snippets.

@traviskaufman
Last active May 14, 2020 17:06
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save traviskaufman/08847d4cdf7c42bc4d84 to your computer and use it in GitHub Desktop.
Save traviskaufman/08847d4cdf7c42bc4d84 to your computer and use it in GitHub Desktop.
Merge Intervals - O(n) average case time rather than THETA(nlogn)
// See: http://www.programcreek.com/2012/12/leetcode-merge-intervals/
console.log(mergeIntervals([[1,3],[2,6],[8,10],[15,18]]));
console.log(mergeIntervals([[1,8], [2,10], [3,6]]));
console.log(mergeIntervals([[1,8], [2, 8], [3, 6]]));
function mergeIntervals(intervals) {
if (intervals.length < 2) {
return intervals;
}
var buckets = [], merged = [], iMap = new Map(), intervalIdx = 0;
for (let i = 0, interval; interval = intervals[i]; i++) {
let [lo, hi] = interval;
if (!buckets[lo]) buckets[lo] = [];
if (!buckets[hi]) buckets[hi] = [];
buckets[lo].push(i);
buckets[hi].push(i);
}
for (let i = 0; i < buckets.length; i++) {
let intervals = buckets[i];
if (intervals == null) continue;
intervals.forEach(function(interval) {
iMap.set(interval, (iMap.get(interval) || 0) + 1);
if (!merged[intervalIdx]) merged[intervalIdx] = [i];
if (iMap.get(interval) == 2) {
iMap.delete(interval);
if (iMap.size == 0) {
merged[intervalIdx][1] = i;
intervalIdx++;
}
}
});
}
return merged;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment