js如何验证多组区间是否重叠

在JavaScript中验证多组区间是否重叠,可以通过以下步骤和算法来实现:

步骤:

  1. 理解区间重叠的概念

    • 区间重叠指的是如果有两个区间 [a, b] 和 [c, d],它们重叠的条件是存在交集,即 a <= d 并且 c <= b。
  2. 排序区间

    • 首先,将所有的区间按照起始端点进行排序。如果起始端点相同,则可以按照结束端点排序,但通常按照起始端点排序即可。
  3. 迭代检查重叠

    • 从第一个区间开始,依次与下一个区间比较,检查是否有重叠。如果当前区间与下一个区间重叠,则合并这两个区间(更新结束端点),继续检查下一个区间。
    • 如果当前区间与下一个区间不重叠,则将当前区间添加到结果列表中,更新当前区间为下一个区间,继续检查下一个区间。
  4. 最终结果

    • 迭代完成后,得到的结果列表即为没有重叠的区间集合。

JavaScript 实现示例:

javascript
function mergeIntervals(intervals) { // 如果区间为空或者只有一个区间,直接返回 if (intervals.length <= 1) { return intervals; } // 按照起始端点进行排序 intervals.sort((a, b) => a[0] - b[0]); let merged = [intervals[0]]; // 存放合并后的区间结果 for (let i = 1; i < intervals.length; i++) { let current = merged[merged.length - 1]; // 当前已合并的最后一个区间 let next = intervals[i]; // 如果当前区间与下一个区间重叠,则合并区间 if (current[1] >= next[0]) { current[1] = Math.max(current[1], next[1]); // 更新当前区间的结束端点 } else { merged.push(next); // 不重叠,将下一个区间加入结果列表 } } return merged; } // 示例用法 let intervals = [[1, 3], [2, 6], [8, 10], [15, 18]]; let mergedIntervals = mergeIntervals(intervals); console.log(mergedIntervals); // 输出 [[1, 6], [8, 10], [15, 18]]

解释:

  • mergeIntervals 函数接受一个二维数组 intervals,每个子数组表示一个区间。
  • 首先对区间数组按照起始端点排序。
  • 使用 merged 数组来存放合并后的区间结果。
  • 迭代排序后的区间数组,比较当前区间与下一个区间是否重叠,根据情况合并或者加入结果数组。
  • 最后返回合并后的结果数组 merged

这种方法的时间复杂度主要取决于排序步骤,为 O(n log n),其中 n 是区间的个数。迭代检查重叠的步骤是线性的,为 O(n)。