题目:原题链接(困难)

标签:几何、数学

解法 时间复杂度 空间复杂度 执行用时
Ans 1 (Python) O ( 1 ) O(1) O(1) O ( 1 ) O(1) O(1) 44ms (38.46%)
Ans 2 (Python)
Ans 3 (Python)

解法一:

class Solution:
    def intersection(self, start1: List[int], end1: List[int], start2: List[int], end2: List[int]) -> List[float]:
        k1 = (end1[1] - start1[1]) / (end1[0] - start1[0]) if end1[0] != start1[0] else float("inf")
        k2 = (end2[1] - start2[1]) / (end2[0] - start2[0]) if end2[0] != start2[0] else float("inf")

        # 处理两条线段均垂直于X轴的情况
        if k1 == k2 == float("inf"):
            if (start1[0] != start2[0]
                    or min(start1[1], end1[1]) > max(start2[1], end2[1])
                    or max(start1[1], end1[1]) < min(start2[1], end2[1])):
                return []
            return [start1[0], max(start1[1], start2[1])]

        b1 = start1[1] - k1 * start1[0] if k1 != float("inf") else start1[0]
        b2 = start2[1] - k2 * start2[0] if k2 != float("inf") else start2[0]

        # 处理两条线段为平行线的情况
        if k1 == k2:
            if (b1 != b2
                    or min(start1[1], end1[1]) > max(start2[1], end2[1])
                    or max(start1[1], end1[1]) < min(start2[1], end2[1])):
                return []
            return [max(start1[0], start2[0]), max(start1[1], start2[1])]

        # 处理有一条线段平行与X轴的情况
        if k1 == float("inf"):
            k1, k2, b1, b2 = k2, k1, b2, b1
        if k2 == float("inf"):
            x = b2
            y = k1 * x + b1
            if (min(start1[1], end1[1]) <= y <= max(start1[1], end1[1])
                    and min(start2[1], end2[1]) <= y <= max(start2[1], end2[1])):
                return [x, y]
            else:
                return []

        # 计算两条线段的交点
        x = (b1 - b2) / (k2 - k1)
        y = k1 * x + b1

        if (not min(start1[0], end1[0]) <= x <= max(start1[0], end1[0])
                or not min(start1[1], end1[1]) <= y <= max(start1[1], end1[1])
                or not min(start2[0], end2[0]) <= x <= max(start2[0], end2[0])
                or not min(start2[1], end2[1]) <= y <= max(start2[1], end2[1])):
            return []

        return [x, y]