示例图1
示例图2
给定二维空间中的 N 个点,我们需要打印经过所有这 N 个点并且也经过特定 (xO, yO) 点的最少线数。
示例:
如果给定的点为 (-1, 3), (4, 3), (2, 1), (-1, -2), (3, -3) 且 (xO, yO) 点为 (1, 0),即每条线都必须经过此点。那么我们必须绘制至少两条线来覆盖所有经过 (xO, yO) 的点。
我们可以通过考虑所有点的斜率(xO,yO)来解决这个问题。如果两个不同的点的斜率(xO,yO)相同,那么它们可以用同一条线覆盖,这样我们就可以跟踪每个点的斜率,每当我们得到一个新的斜率时,我们就将线数增加一。
在下面的代码中,斜率被存储为一对整数以消除精度问题,并使用一个集合来跟踪发生的斜率。 请参阅下面的代码以更好地理解。
示例代码:
# Python3 program to get minimum lines to cover
# all the points
# Utility method to get gcd of a and b
def gcd(a, b):
if (b == 0):
return a
return gcd(b, a % b)
# method returns reduced form of dy/dx as a pair
def getReducedForm(dy, dx):
g = gcd(abs(dy), abs(dx))
# get sign of result
sign = (dy < 0) ^ (dx < 0)
if (sign):
return (-abs(dy) // g, abs(dx) // g)
else:
return (abs(dy) // g, abs(dx) // g)
# /* method returns minimum number of lines to
# cover all points where all lines goes
# through (xO, yO) */
def minLinesToCoverPoints(points, N, xO, yO):
# set to store slope as a pair
st = dict()
minLines = 0
# loop over all points once
for i in range(N):
# get x and y co-ordinate of current point
curX = points[i][0]
curY = points[i][1]
temp = getReducedForm(curY - yO, curX - xO)
# if this slope is not there in set,
# increase ans by 1 and insert in set
if (temp not in st):
st[temp] = 1
minLines += 1
return minLines
# Driver code
xO = 1
yO = 0
points =[[-1, 3],
[4, 3],
[2, 1],
[-1, -2],
[3, -3]]
N = len(points)
print(minLinesToCoverPoints(points, N, xO, yO))
# This code is contributed by mohit kumar 29
输出:
2
时间复杂度: O(N)
辅助空间: O(N)