求解重叠区域线段覆盖总长度_求线段总长度_线段覆盖长度
总结了网上目前流传的两种方法,并写出了javascript版本:
let e1 = [
[2, 4],
// [0, 19],
[3, 8],
[10, 12]
]
// 解法1. 排序后扫描(机器思维)
let totalLength1 = function (fragments) {
let res = 0
// sort by start number
let sorted = fragments.sort((a, b) => a[0] - b[0])
let start = sorted[0][0]
let end = sorted[0][1]
for (let i = 1; i < sorted.length; i++) {
let value = sorted[i]
// Pseudo code:
// if hasIntersection-> (end > value[0]) then 更新end值 loop until notIntersection
// else update start end value
while (end > value[0]) { // 一看到while循环,就要想到,每个循环内必须手动更新变量
end = value[1] > end ? value[1] : end
i++
if (i >= sorted.length) break
value = sorted[i]
}
// accumulation
res += (end - start)
// update start && end value
start = value[0]
end = value[1]
// 这个时候i表示的是下一个值的索引(下一个值因为没有达到while条件被弹出了),下一个遍历因为会++,所以这里要--
i--
}
return res
}
// 解法2. 像素化(不考虑空间开销)
let totalLength2 = function (fragments) {
let flat = fragments.flat(1)
let min = Math.min(...flat)
let max = Math.max(...flat)
let length = max - min
let pixelArray = Array(length).fill(false)
for (let item of fragments) {
console.log(item)
for (let i = item[0] - min; i < item[1] - min; i++) {
pixelArray[i] = true
}
}
console.log(pixelArray)
return pixelArray.filter(item => item == true).length
}
// test
let res = totalLength1(e1)
console.log(res)
这道题是2022年字节跳动前端面试题