【问题标题】:Find squares amongst a set of trees在一组树中找到正方形
【发布时间】: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


【解决方案1】:

这两个点现在唯一确定剩余的两个点。

你的想法是正确的:迭代每一边,并尝试在它周围建立两个正方形(一个正方形将是另一个正方形的镜像)。

但是,这个想法需要三个 for 循环,即 O(N^3)。所以我想知道如何优化这段代码以实现 O(N^2)。

您可以将第三个循环替换为哈希表查找,即 O(1)。构建哈希表需要 O(N),所以你的算法的总体时间是 O(N^2)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-09
    • 2011-12-05
    • 1970-01-01
    • 2014-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多