【发布时间】:2014-08-14 21:35:04
【问题描述】:
假设我们是一个猎人,在有 N 棵树的森林里。为了猎杀最好的鹿,我们打算从一棵树到另一棵树建造栅栏,这样我们最终得到一个精确的正方形。进一步假设给定森林中 N 棵树中每棵树的 (x,y) 坐标列表。我们想找到最大可能的正方形和任何大小的可能正方形的总数?目标为 O(N^2)。
例如列表 (4, 10), (3, 13), (2, 10), (1, 13), (3, 11), (5, 11), (4, 14), (1, 11), (9, 15), (9, 11), (5, 15) 包含三个可能的正方形,这三个正方形中最大的正方形由 (5, 11), (9, 15), ( 9, 11), (5, 15)。
我的基本尝试是编写一个遍历整个点列表(从 1 到 N)的 for 循环,然后包含第二个 for 循环,再次遍历所有点,从 i 到 N,其中 i是第一个 for 循环的当前增量。这两个点现在唯一地确定剩余的两个点。因此我们需要一个 for 循环(从 j 开始,其中 j 是第二个 for 循环的当前增量)来检查这两个剩余点是否存在。如果它们存在,那么我们找到了一个正方形。找到所有方格后,找到最大的方格就很容易了。
但是,这个想法需要三个 for 循环,即 O(N^3)。所以我想知道如何优化这段代码以实现 O(N^2)。
【问题讨论】:
-
这些方块是否需要与坐标系对齐?例如。 (1,0), (0,1), (1,2), (2,1) 是有效答案吗?
-
@ElKamina 是的,你的例子是一个有效的答案。
标签: arrays algorithm list find time-complexity