【发布时间】:2020-03-24 13:58:39
【问题描述】:
我在下面有一个二维列表:
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 的正方形并返回右下角的点。实现此代码的更好方法是什么?
假设二维列表按 x 坐标升序排序。
更新:
我发现我的代码有问题的案例:
[7, 11], [7, 12], [7, 13], [8, 11], [8, 12]
[7, 13] 的点使我的代码无法检测到正方形。
【问题讨论】:
-
所以正方形必须由连续的点组成,而不是列表中的任意四个点?
-
@MOehm 必须由连续点组成
-
就复杂性而言,你真的不能做得更好(这是线性的,你不能做得更好。充其量也许你可以赢得一个常数因素)。你的问题是关于实现和编写好的代码吗?
-
@gdelab 是的,我的问题是如何让我的代码看起来更好
-
@gdelab 我的代码也有问题,当有case时:
[7, 11], [7, 12], [7, 13], [8, 11], [8, 12]。点[7, 13]将位于中间,我的代码可以检测到正方形