计算javascript范围重叠的算法

时间:2017-05-25 08:13:21

标签: javascript algorithm

输入整数始终为正

输入:[[1, 4], [3, 7], [6, 8], [10,15]]
输出:[[1, 8], [10,15]]

输入:[[3, 4], [1,3], [5, 9], [5, 12]]
输出:[[1, 4], [5, 12]]

我读了这个stackoverflow,但如果有更好的方法就会徘徊。

4 个答案:

答案 0 :(得分:1)

您可以对数据进行升序排序,然后检查前一个是否适合最后一个范围。如果没有将实际数组附加到结果集。



function groupRanges(array) {
    return array
        .sort(function (a, b) { return a[0]- b[0] || a[1]- b[1]; })
        .reduce(function (r, a) {
            var last = r[r.length - 1] || [];
            if (a[0] <= last[1]) {
                if (last[1] < a[1]) {
                    last[1] = a[1];
                }
                return r;
            }
            return r.concat([a]);
        }, []);
}

console.log(groupRanges([[1, 4], [3, 7], [6, 8], [10,15]]));
console.log(groupRanges([[3, 4], [1,3], [5, 9], [5, 12]]));
&#13;
.as-console-wrapper { max-height: 100% !important; top: 0; }
&#13;
&#13;
&#13;

答案 1 :(得分:1)

对于范围的每个开始和结束,都会创建一个包含值的对和开始和结束的+1/-1

使用+-1作为比较函数中的辅助键,按值对这些对进行排序:(x,+1) before (the same x,-1)

制作ActiveRanges=0,浏览对列表/数组,将+-1添加到ActiveRanges

ActiveRanges变为非零时,大范围开始。

ActiveRanges变为零时,大范围结束。

答案 2 :(得分:0)

这是我想出的,使用MathJS库来生成范围:

&#13;
&#13;
let input = [[1, 4], [3, 7], [6, 8], [10,15]]

let workArray = input.map( arr => math.range(arr.join(":"), true )._data )
workArray = [].concat.apply([], workArray) // Concatenating all values
workArray = [...new Set(workArray)] // Deduplicating, sorting

let output = [],
	min = workArray[0],
	max = min

for( let i=0, l=workArray.length; i<l ; i++){
	if(max+1 != workArray[i+1]){
		output.push([min,max])
		min = workArray[i+1]
		max=min
	} else {
		max++	
	}
}

console.log(output) // [ [1,8] , [10,15] ]
&#13;
<script src="https://cdnjs.cloudflare.com/ajax/libs/mathjs/3.13.1/math.min.js"></script>
&#13;
&#13;
&#13;

答案 3 :(得分:0)

如果数组长度为4(根据您的示例)并且所有内容都是如您所述的那样是常量,那么这是一个您可以使用的简单函数:

function reGroup(arr) {
    const x = [arr[0][0], arr[2][1]];
    return [x, arr[3]];
}