我有一个二维列表如下:
a = [[3, 10], [7, 11], [7, 12], [8, 11], [8, 12], [12, 8], [12, 9], [13, 8], [13, 9], [14, 6], [14, 7], [15, 8], [17, 6], [18, 6]]
有4个点可以形成正方形:
[7, 11], [7, 12], [8, 11], [8, 12]
或者这个:
[12, 8], [12, 9], [13, 8], [13, 9]
这是我的代码:
def find_square(a):
i = 0
result = []
while(i < len(a)):
if a[i][0] == a[i + 1][0]:
if a[i][1] == a[i + 2][1]:
if a[i + 2][0] == a[i + 3][0]:
if a[i + 1][1] == a[i + 3][1]:
result.append([a[i][0] + 1, a[i][1] + 1])
i += 4
else:
i += 3
else:
i += 2
else:
i += 1
return result
输出:
[8, 12], [13, 9]
此代码将返回正方形的最后一点(右下角)。我想检查是否有4个点可以形成一个边长为1的正方形,并返回右下角的点。实现此代码的更好方法是什么
假定2D列表按x坐标的升序排序
更新:
我发现我的代码有问题:
[7, 11], [7, 12], [7, 13], [8, 11], [8, 12]
点[7, 13]
使我的代码无法检测到正方形
不要求点连续,甚至不要求列表以任何方式排序的解决方案:
然而,它是在
Theta(N⁴)
中,而利用列表是按x
排序的,只有整数坐标,并且平方大小必须是1的事实,在Theta(N²)
中有一个最坏的解决方案,在平均值上甚至是Theta(N)
(见Alex's answer)嗯,也许是这样的:
变量的名称为
bl
表示左下角,tl
表示左上角,br
表示右下角,以及tr
表示右上角。在if
的第一行,我们检查x
坐标,在第二行-检查y
坐标,在第三行,我们检查它是正方形,不是矩形针对新情况进行更新
说明:首先,我们遍历数组并查找点,这些点上面有另一个点。如果我们找到这样一个点,那么我们将向字典
d
添加一个新值。键是一个垂直坐标,该值将包含可能的x
坐标列表。在下一个循环中,我们只需遍历这些x
坐标列表,并检查该列表是否包含两个连续的x
坐标。如果有,那么我们找到了一个正方形相关问题 更多 >
编程相关推荐