边工作边刷题:70天一遍leetcode: day 7

Max Points on a Line

要点:这题暴力解是用任何两点确定一条直线,然后对其他点检查是否共线,显然,这里没用空间来存储之前的检查结果,所以time complexity是O(n3)。这题的难点是如何存储从而实现O(n2)解。思路是另一种确定一条直线的方法是一点和theta,所以theta可以作为map的key。每次内循环就是检查对于该点下最多共线的点数。
错误点:

  • 双循环loop所有pair的方法,inner loop要找外层index的下一个
  • hashmap是local的,不是global的
  • localmax=1: 这样1个点或者都是相同点可以pass
  • theta的计算:对于java,因为坐标是int,必须先用(double) cast,及时theta类型是double。而python没有类型,用float(x-x0)即可
# Definition for a point.
# class Point(object):
#     def __init__(self, a=0, b=0):
#         self.x = a
#         self.y = b

class Solution(object):
    def maxPoints(self, points):
        """
        :type points: List[Point]
        :rtype: int
        """
        maxp = 0
        for i in range(len(points)):
            localmax = 1
            hmap = {}
            x,y = points[i].x,points[i].y
            same = 0
            for j in range(i+1, len(points)):
                px,py = points[j].x,points[j].y
                if px-x==0:
                    if py==y:
                        same+=1
                        continue
                    else:
                        theta = float("inf")
                else:
                    theta = (py-y)/float(px-x)
                print i,j, theta
                if theta not in hmap:
                    hmap[theta]=2
                else:
                    hmap[theta]+=1
                if hmap[theta]>localmax:
                    localmax = hmap[theta]
            if localmax+same>maxp:
                maxp = localmax+same
        return maxp
                

posted @ 2016-05-18 11:59  absolute100  阅读(129)  评论(0编辑  收藏  举报