Max Overlapping Segments (Sweep Line + Heap)

扫描线:按起点排序 + 小根堆维护当前覆盖的线段终点。

#resource / algorithm #type / howto #status / growing #ds / heap #algo / sweep-line

[!info] related notes 算法面试题型 MOC 堆常见题

Max Overlapping Segments (Sweep Line + Heap)

给定若干线段 [start, end],求同一时刻最多有多少条线段重合。

思路

  • start 从小到大排序。
  • 用小根堆存当前“活跃线段”的 end
  • 扫描每条线段:
    • 把堆里所有 end <= start 的线段弹出(它们已经不再覆盖当前 start)。
    • 把当前线段的 end 入堆。
    • 堆大小就是当前重合数,维护最大值。

复杂度:O(n log n)(排序 + 堆操作)。

Java Template

import java.util.*;

public class MaxOverlap {
    public static int maxOverlap(int[][] segs) {
        Arrays.sort(segs, (a, b) -> a[0] - b[0]);
        PriorityQueue<Integer> heap = new PriorityQueue<>();
        int ans = 0;
        for (int[] s : segs) {
            int start = s[0], end = s[1];
            while (!heap.isEmpty() && heap.peek() <= start) heap.poll();
            heap.add(end);
            ans = Math.max(ans, heap.size());
        }
        return ans;
    }
}
创建于 2026/3/16 更新于 2026/5/27