LeetCode第149题—直线上最多的点数—Python实现

Posted StriveZs

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode第149题—直线上最多的点数—Python实现相关的知识,希望对你有一定的参考价值。


title: LeetCode No.149

categories:

  • OJ
  • LeetCode

tags:

  • Programing
  • LeetCode
  • OJ

LeetCode第149题—直线上最多的点数

自己代码的开源仓库:click here 欢迎Star和Fork 😃

题目描述

给你一个数组 points ,其中 points[i] = [xi, yi] 表示 X-Y 平面上的一个点。求最多有多少个点在同一条直线上。

示例 1:

输入:points = [[1,1],[2,2],[3,3]]
输出:3

示例 2:
输入:points = [[1,1],[3,2],[5,3],[4,1],[2,3],[1,4]]
输出:4

提示:

1 <= points.length <= 300
points[i].length == 2
-104 <= xi, yi <= 104
points 中的所有点 互不相同

代码

from fractions import Fraction
class Solution(object):
    # 统计在直线上点的个数
    def num_points_on_line(self, k, b, points):
        num = 0
        for i in range(len(points)):
            if points[i][0] * k + b == points[i][1]:
                num += 1
        return num

    def time_out(self, points):
        """
        暴力搜索的方法,目前自己能想到的方法
        找到两个点求出斜率,然后确定还有多少个点在上面,找到最大的, 暴力搜索不出意外的Time out了,下面尝试对代码进行优化
        :type points: List[List[int]]
        :rtype: int
        """
        if len(points) == 1:
            return 1
        if len(points) == 2:
            return 2
        max_num = 0
        for i in range(len(points)):
            for j in range(len(points)):
                if i == j:
                    continue
                if points[i][0] - points[j][0] == 0: # 为纵轴的情况
                    cur_num = 0
                    for m in range(len(points)):
                        if points[m][0] == points[i][0]:
                            cur_num += 1
                else:
                    k = Fraction((points[i][1] - points[j][1]) , (points[i][0] - points[j][0]))
                    b = points[i][1] - k * points[i][0]
                    cur_num = self.num_points_on_line(k, b, points)
                if cur_num > max_num:
                    max_num = cur_num
        return max_num

    def maxPoints(self, points):
        """
        不出意料的暴力搜索的代码直接裂开了,我最开始的那个暴力算法冗余度太高了,后面需要进行优化,这里使用哈希表进行记忆
        可以使用如下方法:
            固定一个点来统计和其他的点的斜率
            最后再将斜率和b相同的点个数统计,返回最大的值
            考虑用字典来记录,字典:斜率: [位于当前斜率上的点]
        :type points: List[List[int]]
        :rtype: int
        """
        if len(points) == 1:
            return 1
        if len(points) == 2:
            return 2
        max_num = 0
        k_num = dict()
        for i in range(len(points)):
            for j in range(len(points)):
                if i == j:
                    continue
                if points[i][0] - points[j][0] == 0: # 为纵轴的情况  斜率不存在用对应的x值的字符串表示
                    if str(points[i][0]) not in k_num.keys():
                        k_num[str(points[i][0])] = []
                    if points[i] not in k_num[str(points[i][0])]:
                        k_num[str(points[i][0])].append(points[i])
                    if points[j] not in k_num[str(points[i][0])]:
                        k_num[str(points[i][0])].append(points[j])
                    if len(k_num[str(points[i][0])]) > max_num:
                        max_num = len(k_num[str(points[i][0])])
                else:
                    k = Fraction((points[i][1] - points[j][1]) , (points[i][0] - points[j][0]))
                    b = points[i][1] - k * points[i][0]
                    key = str(k)+','+str(b)
                    if key not in k_num.keys():
                        k_num[key] = []
                    if points[i] not in k_num[key]:
                        k_num[key].append(points[i])
                    if points[j] not in k_num[key]:
                        k_num[key].append(points[j])
                    if len(k_num[key]) > max_num:
                        max_num = len(k_num[key])
        return max_num
if __name__ == '__main__':
    s = Solution()
    print(s.maxPoints([[0,0],[4,5],[7,8],[8,9],[5,6],[3,4],[1,1]]))

以上是关于LeetCode第149题—直线上最多的点数—Python实现的主要内容,如果未能解决你的问题,请参考以下文章

leetcode 149. 直线上最多的点数

LeetCode 149. 直线上最多的点数 / NC14 二叉树的之字形层序遍历 / NC37 合并区间

leetcode 149. 直线上最多的点数

Leetcode No.149 直线上最多的点数

Leetcode No.149 直线上最多的点数

题目地址(149. 直线上最多的点数)