在 javascript 中获取两个范围之间的交集
get intersection between two ranges in javascript
我试图找到两个范围(int 值)和(如果存在)return 包含交集起点和终点的数组之间的交集
例子
range 1 : 2,5
range 2 : 4,7
result : 4,5
我发现了其他几个关于数组之间交集的主题,但没有人帮助我找到确切的交集
(我刚发现一个有用的函数,如果交集存在但不告诉交集是什么,returns a 'true')
我的算法很差,所以我发现了一些问题,非常感谢您的提示
谢谢
这只是一些基本逻辑。
struct range
int start , end
range intersection(range a , range b)
//get the range with the smaller starting point (min) and greater start (max)
range min = (a.start < b.start ? a : b)
range max = (min == a ? b : a)
//min ends before max starts -> no intersection
if min.end < max.start
return null //the ranges don't intersect
return range(max.start , (min.end < max.end ? min.end : max.end))
如果我没理解错的话——你想得到对的交集
const range = [
[8, 12], [17, 22]],
[[5, 11], [14, 18], [20, 23]];
你希望交叉点是这样的:
const result = [[8, 11], [17, 18], [20, 22]]
可以通过获取 startMax 和 endMin 用两个周期来完成,也可以使用索引将复杂度降低到 O(n)
好吧,现在我们需要构建函数来找到这些交点:
function intersection(user1, user2) {
const targetUser = (user1.length >= user2.lengh ? user1 : user2);
const restUser = (targetUser == user1 ? user2 : user1);
const foundItersections = targetUser.map(tu=> {
const mwminmax = restUser.map(ru => {
const startMax = (tu[0]>=ru[0] ? tu[0] : ru[0])
const endMin =(tu[1]<=ru[1] ? tu[1] : ru[1])
if(startMax<endMin){
const retarr = [].concat(startMax,endMin)
return retarr;
}
else return;
})
const filteredmwminmax = mwminmax.filter(x=>x!==undefined)
return filteredmwminmax;
})
return foundItersections.flat();
}
console.log(intersection(
[[8, 12], [17, 22]],
[[5, 11], [14, 18], [20, 23]]
))
// [[8, 11], [17, 18], [20, 22]]
console.log(intersection(
[[9, 15], [18, 21]],
[[10, 14], [21, 22]]
))
// [[10, 14]]
我试图找到两个范围(int 值)和(如果存在)return 包含交集起点和终点的数组之间的交集
例子
range 1 : 2,5
range 2 : 4,7
result : 4,5
我发现了其他几个关于数组之间交集的主题,但没有人帮助我找到确切的交集 (我刚发现一个有用的函数,如果交集存在但不告诉交集是什么,returns a 'true')
我的算法很差,所以我发现了一些问题,非常感谢您的提示
谢谢
这只是一些基本逻辑。
struct range
int start , end
range intersection(range a , range b)
//get the range with the smaller starting point (min) and greater start (max)
range min = (a.start < b.start ? a : b)
range max = (min == a ? b : a)
//min ends before max starts -> no intersection
if min.end < max.start
return null //the ranges don't intersect
return range(max.start , (min.end < max.end ? min.end : max.end))
如果我没理解错的话——你想得到对的交集
const range = [
[8, 12], [17, 22]],
[[5, 11], [14, 18], [20, 23]];
你希望交叉点是这样的:
const result = [[8, 11], [17, 18], [20, 22]]
可以通过获取 startMax 和 endMin 用两个周期来完成,也可以使用索引将复杂度降低到 O(n)
好吧,现在我们需要构建函数来找到这些交点:
function intersection(user1, user2) {
const targetUser = (user1.length >= user2.lengh ? user1 : user2);
const restUser = (targetUser == user1 ? user2 : user1);
const foundItersections = targetUser.map(tu=> {
const mwminmax = restUser.map(ru => {
const startMax = (tu[0]>=ru[0] ? tu[0] : ru[0])
const endMin =(tu[1]<=ru[1] ? tu[1] : ru[1])
if(startMax<endMin){
const retarr = [].concat(startMax,endMin)
return retarr;
}
else return;
})
const filteredmwminmax = mwminmax.filter(x=>x!==undefined)
return filteredmwminmax;
})
return foundItersections.flat();
}
console.log(intersection(
[[8, 12], [17, 22]],
[[5, 11], [14, 18], [20, 23]]
))
// [[8, 11], [17, 18], [20, 22]]
console.log(intersection(
[[9, 15], [18, 21]],
[[10, 14], [21, 22]]
))
// [[10, 14]]