问题描述:
其思想是在现有间隔中插入新间隔,新间隔不与现有间隔合并,而是填充间隔之间缺失的间隔。(
这不是间隔合并问题
)
例如,将间隔[0,7]插入到间隔[0,1],[3,5]]将生成新间隔,其中填充了间隔[0,1],[1,3],[3,5],[5,7]]。
间隔范围已排序
最小到较大
[[0, 1], [3, 5]]
.
我目前的解决方案有点“支离破碎”,最后我用了太多的if检查来覆盖一些特殊情况,这使得所有事情都变得更加复杂。我正在寻找更好的方法
简化条件部分
. 在代码的底部包含了一些测试案例,还有我的解决方案失败的案例。
我的算法失败并产生错误结果的测试用例:
assert.deepEqual( // Broken
insertIntervalSec([[1,5], [7,10]], [4, 12]),
[[1,5], [5, 7], [7,10], [10, 12]],
);
assert.deepEqual(insertIntervalSec([[1,1]], [1,3]), [[1,3]]); // Broken
function isOverLapping(a, b) {
return Math.max(a[0], b[0]) <= Math.min(a[1], b[1]);
}
function insertIntervalSec(arr, interval) {
const result = [];
let i = 0;
const contains = (a, b) => {
return a[0] >= b[0] && a[1] <= b[1]
};
if (arr.length <= 0) {
result.push(interval);
return result;
}
if (arr.length === 1 && contains(interval, arr[0])) {
result.push(interval);
return result;
}
// Start point
if (interval[1] >= arr[0][0] && isOverLapping(interval, arr[0])) {
result.push([interval[0], arr[0][0]]);
} else if (interval[1] <= arr[0][0]) {
result.push([interval[0], Math.min(interval[1], arr[0][0])]);
}
while (i < arr.length) {
const current = arr[i];
result.push(arr[i]);
if (!contains(interval, arr[i]) && isOverLapping(arr[i], interval)) {
const next = arr[i + 1];
// Special handling for the last item
if (next !== undefined) {
if (interval[1] > current[1]) {
result.push([current[1], next[0]]);
}
} else {
if (interval[0] <= current[0] && interval[1] <= current[1]) {
// TODO: No action
} else if (interval[0] >= current[0] || interval[1] >= current[0]) {
result.push([current[1], interval[1]]);
}
}
}
i++;
}
// End point
const len = arr.length;
const last = arr[len - 1];
if (last[1] <= interval[0] && !isOverLapping(last, interval)) {
result.push(interval);
}
return result;
}
assert.deepEqual(
insertIntervalSec([[1,5],[10,15],[20,25]], [12,27]),
[[1,5],[10,15],[15,20],[20,25],[25, 27]]
);
assert.deepEqual(
insertIntervalSec([[1,5],[10,15],[20,25]], [-3,0]),
[[-3,0],[1,5],[10,15],[20,25]]
);
assert.deepEqual(
insertIntervalSec([[1,5],[10,15],[20,25]], [-3,3]),
[[-3,1],[1,5],[10,15],[20,25]]
);
assert.deepEqual(
insertIntervalSec([[0,5],[10,15],[20,25]], [15,15]),
[[0,5],[10,15],[20,25]]
);
assert.deepEqual(
insertIntervalSec([[0,5],[10,15],[20,25]], [20,21]),
[[0,5],[10,15],[20,25]]
);
assert.deepEqual(
insertIntervalSec([[0,5],[10,15],[20,25]], [26,27]),
[[0,5],[10,15],[20,25],[26, 27]]
);
assert.deepEqual(
insertIntervalSec([[0,5],[10,15],[20,25]], [25,27]),
[[0,5],[10,15],[20,25],[25,27]]
);
assert.deepEqual(insertIntervalSec([], [25,27]), [[25,27]]);
assert.deepEqual(insertIntervalSec([[1,1]], [1,1]), [[1,1]]);
assert.deepEqual( // Broken
insertIntervalSec([[1,5], [7,10]], [4, 12]),
[[1,5], [5, 7], [7,10], [10, 12]],
);
assert.deepEqual(insertIntervalSec([[1,1]], [1,3]), [[1,3]]); // Broken
assert.deepEqual(
insertIntervalSec2([[5,5]], [6,6]),
[[5,5], [6,6]]
);
assert.deepEqual(
insertIntervalSec2([[1,3]], [6,6]),
[[1,3], [6,6]]
);