📅  最后修改于: 2023-12-03 15:06:35.448000             🧑  作者: Mango
介绍:给定N条线段,平面上存在多条水平线(y坐标相同),求这些水平线与线段的交点中y坐标的最小值。
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)$。