📜  从平面中的N条线中找到最小的y坐标(1)

📅  最后修改于: 2023-12-03 15:06:35.448000             🧑  作者: Mango

从平面中的N条线中找到最小的y坐标

介绍:给定N条线段,平面上存在多条水平线(y坐标相同),求这些水平线与线段的交点中y坐标的最小值。

算法思路
  1. 将所有线段按照起点纵坐标从小到大排序。
  2. 用一个优先队列(堆)维护线段终点(纵坐标最小的点),堆顶即为当前终点最小的线段。
  3. 将所有与当前水平线相交的线段的终点加入堆中。
  4. 当堆顶点和水平线相交时,更新最小值。
代码实现
import heapq

def find_min_y(N, lines):
    lines.sort(key=lambda x: x[0][1])  # 按起点纵坐标排序
    q = []  # 用小根堆维护终点纵坐标最小的线段
    res = float('inf')  # 记录最小交点y坐标
    for y, _ in lines:
        while q and q[0][1] < y:  # 移除已经过期的线段
            heapq.heappop(q)
        for line in lines:  # 将当前水平线上的所有线段的终点加入堆中
            if line[0][1] <= y <= line[1][1]:
                heapq.heappush(q, (line[1][1], line))
        if q:
            _, (_, p2) = q[0]
            if p2[0][1] == y:  # 如果堆顶为当前水平线上的线段,则需比较两条线段终点横坐标的大小
                res = min(res, min(p2[0][0], p2[1][0]))
            else:  # 否则说明当前水平线与所有线段没有交点,退出循环
                break
    return res
性能分析

本算法的时间复杂度为 $O(NlogN)$,其中 $N$ 表示线段的条数。排序的复杂度为 $O(NlogN)$,每个点过一次堆的复杂度为 $O(logN)$,总共过点的次数不会超过线段的条数,因此总复杂度为 $O(NlogN)$。