【问题标题】:Check if a road is available in something similar to a binary tree检查类似于二叉树的道路是否可用
【发布时间】:2016-10-27 14:39:11
【问题描述】:

我有一个坐标系统,看起来像 http://i.imgur.com/oKCU2uv.png 点 -> (depthToNode, Node)。但我没有这个结构,只有原始点。您只能从 (x,y) 转到 (x+1,y+1) 或 (x+1,y-1)。

我得到的数据是 n = b 被阻止。下一个 x 总是大于前一个。例如:(x,a,b) -> (4,0,5)。然后我知道x = 4上的未阻塞点是(4,2),(4,4)。注意,如果x是偶数,那么y也一定是偶数,否则我们不能通过这样的点,例如(4,1), (4,3)。

我注意到如果我们的坐标像 (s,m) 并且我想去 (c,d) 那么如果 c+d-s-m >= 0 那么我可以从点 (s,m) 到 (c, d)。但问题是,如果我得到 500000 个带有阻塞点的“支柱”,并且这些点从 y 10^8 被阻塞,那么就有大量的点需要检查。

所以问题是:我如何检查我是否可以从点 (0,0) 到点之一 (x,y) 避开阻碍路径的点。 (x,y) 是最后一个'pillar'中没有被阻挡的所有点

示例 1:

输入:

4

1 0 2

4 -5 3

5 1 3

8 2 5

输出:否

示例 2:

输入:

4

1 0 2

4 3 5

5 -1000 3000

8 1 98

输出:是

【问题讨论】:

  • 澄清请求:如果 (x,a,b) → (4,0,5) 并且只有值 strictly 小于 astrictly 大于 b 的节点被省略,剩余的节点集应为(4,0); (4,2); (4,4)。不等式真的严格吗?在哪一端?
  • 对不起,我的错误,它应该小于甚至小于a,大于甚至大于b

标签: algorithm search binary-search-tree


【解决方案1】:

无需检查所有可能的节点。

对于树剔除的每个步骤,我们只需要保留 2 个值:在此步骤中幸存的最小和最大节点在其基本级别 N。我们将它们称为 LN 和 U N,分别。

给定范围 [LN; UN] 我们可以很容易地找到 [LN+K; UN+K] 表示任何自然 K。

现在我们选择 K 使得 N + K = N`,即执行下一步剔除的级别。我们已经知道 [LN`; UN`],见上文。现在我们计算 [L`N`; U`N`] — 在 N` 层的下一步中实际幸存下来的值的范围。

将这两个范围相交并重复。

继续直到 [LN`; UN`] ∩ [L`N`; U`N`] = ∅(在这种情况下答案为 NO)或没有更多数据了(答案为 YES)。

插图:

                         0
                     -1     1
                  -2     0     2
               -3    -1     1     3
            -4    -2     0     2     4
         -5    -3    -1     1     3     5
      -6    -4    -2     0     2     4     6
   -7    -5    -3    -1     1     3     5     7
-8    -6    -4    -2     0     2     4     6     8


                         0
                            1                       ←  #1 (1: 0, 2)
                         0     2
                     -1     1     3
                  -2_____0_____2_____4_
               -3    -1     1     3     5
            -4    -2     0     2     4     6
         -5    -3    -1     1     3     5     7
      -6    -4    -2     0     2     4     6     8


                         0
                            1                       ←  #1 (1: 0, 2)
                         0     2
                     -1     1     3
                                     4              ←  #2 (4: 3, 5)
                                 _3_____5_
                               2     4     6
                            1     3     5     7
                         0     2     4     6     8


                         0
                            1                       ←  #1 (1: 0, 2)
                         0     2
                     -1     1     3
                                     4              ←  #2 (4: 3, 5)
                                  3     5           ←  #3 (5: –1000, 3000)
                               2     4     6
                            1     3     5     7
                        _0_____2_____4_____6_____8_


                         0
                            1                       ←  #1 (1: 0, 2)
                         0     2
                     -1     1     3
                                     4              ←  #2 (4: 3, 5)
                                  3     5           ←  #3 (5: –1000, 3000)
                               2     4     6
                            1     3     5     7
                               2     4     6     8  ←  #4 (8: 1, 98)

【讨论】:

    猜你喜欢
    • 2015-04-23
    • 1970-01-01
    • 2018-05-16
    • 1970-01-01
    • 2019-11-05
    • 1970-01-01
    • 2019-04-09
    • 1970-01-01
    相关资源
    最近更新 更多