题目:原题链接(中等)

标签:哈希表、几何

解法 时间复杂度 空间复杂度 执行用时
Ans 1 (Python) O ( N 2 ) O(N^2) O(N2) O ( N 2 ) O(N^2) O(N2) 超出时间限制
Ans 2 (Python) O ( N 2 ) O(N^2) O(N2) O ( N 2 ) O(N^2) O(N2) 408ms (57.48%)
Ans 3 (Python)

解法一:

from fractions import Fraction

class Solution:

    def bestLine(self, points: List[List[int]]) -> List[int]:
        if len(points) <= 1:
            return []

        point_dic = collections.defaultdict(set)
        for i, point in enumerate(points):
            point_dic[(point[0], point[1])].add(i)

        count_line = collections.defaultdict(set)

        # 生成所有直线
        # O(N^2)
        for i in range(len(points)):
            x1, y1 = points[i]
            for j in range(i + 1, len(points)):
                x2, y2 = points[j]
                if x1 != x2 or y1 != y2:
                    k = Fraction((y2 - y1), (x2 - x1)) if x1 != x2 else float("inf")
                    b = y1 - x1 * k if k != float("inf") else x1  # 如果斜率为正无穷,则截距记录竖线的x坐标
                    count_line[(k, b)] |= point_dic[(x1, y1)]
                    count_line[(k, b)] |= point_dic[(x2, y2)]

        # print(count_line)

        # 提取最高频率的直线
        line = [list(sorted(n)) for n in count_line.values()]
        line.sort(key=lambda x: (-len(x), x[0], x[1]))
        return line[0][:2]

解法二(不使用Franction模块处理相近的小数):

class Solution:

    def bestLine(self, points: List[List[int]]) -> List[int]:

        count_line = collections.defaultdict(set)

        # 生成所有直线
        # O(N^2)
        for i in range(len(points)):
            x1, y1 = points[i]
            for j in range(i + 1, len(points)):
                x2, y2 = points[j]
                if x1 != x2 or y1 != y2:
                    k = (y2 - y1)/ (x2 - x1) if x1 != x2 else float("inf")
                    b = y1 - x1 * k if k != float("inf") else x1  # 如果斜率为正无穷,则截距记录竖线的x坐标
                    count_line[(k, b)].add(i)
                    count_line[(k, b)].add(j)

        # print(count_line)

        # 提取最高频率的直线
        line = [list(sorted(n)) for n in count_line.values()]
        line.sort(key=lambda x: (-len(x), x[0], x[1]))
        return line[0][:2]