Skip to content

Instantly share code, notes, and snippets.

@jtribble
Last active January 20, 2016 17:08
Show Gist options
  • Save jtribble/a4521ba74fa869858c45 to your computer and use it in GitHub Desktop.
Save jtribble/a4521ba74fa869858c45 to your computer and use it in GitHub Desktop.
//
// See: http://careercup.com/question?id=5755014750404608
//
// Input: [[1,3], [5,7], [2,4], [6,8]]
// Output: [[1,4], [5,8]] (no specific order)
//
var mergeRanges = (function () {
/**
* Do these two ranges overlap?
*
* @param {array} a
* @param {array} b
* @return {boolen}
*/
var overlaps = function (a, b) {
return a[0] >= b[0] && a[0] <= b[1] // a[lo] is in range of b
|| a[1] >= b[0] && a[1] <= b[1]; // a[hi] is in range of b
};
/**
* Merge two ranges, assuming overlap
*
* @param {array} a
* @param {array} b
* @return {array}
*/
var merge = function (a, b) {
return [Math.min(a[0], b[0]), Math.max(a[1], b[1])];
};
/**
* Merge a single range into a list of ranges
*
* @param {array[array]} list
* @param {array} range
* @param {array[array]}
*/
var mergeRange = function (list, range) {
for (var i = 0; i < list.length; i++) {
if (overlaps(list[i], range)) { // the range overlaps
var newRange = merge(list[i], range);
list.splice(i, 1);
return mergeRange(list, newRange); // recursive call
}
}
list.push(range); // the range doesn't overlap, so just add it to list
return list;
};
/**
* Merge a list of ranges into each other
*
* @param {array[array]} ranges
* @return {array[array]}
*/
return function (ranges) {
return ranges.reduce(function (acc, curr) {
return mergeRange(acc, curr);
}, []);
}
})();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment