在亚马逊访谈中,如何应对这一挑战?

时间:2018-04-17 08:56:54

标签: dictionary graph dynamic-programming memoization directed-acyclic-graphs

我正在努力优化过去的亚马逊面试问题,涉及DAG。

这是我尝试过的(代码很长,我宁愿解释一下) -

  1. 基本上,由于图是一个DAG,并且因为它是一个传递关系,所以每个节点的简单遍历就足够了。

  2. 因此,对于每个节点,我会通过传递性遍历所有可能性来获得结束顶点,然后比较这些结束顶点以获得 最吵闹的人。

  3. 在我的第二步中,我实际上在步骤2中为遍历的所有顶点找到了一个这样的(可能是唯一的)最嘈杂的人。所以我在映射中记住所有这些并标记顶点访问的遍历。

  4. 所以我基本上维护了图表的邻接列表,访问/非访问映射和输出映射(每个顶点最嘈杂的人)。

  5. 通过这种方式,当我得到一个查询时,我不必重新计算任何东西(如果有重复的查询)。
  6. 上面的代码有效但由于我无法测试是否有测试用例,它可能/可能没有通过时间限制。是否有更快的解决方案(可能使用DP)。我觉得我没有充分利用传递和反对称条件。

    显然,我不会检查一个人比现在的人富裕的情况。但是,例如,如果我有像 - (1,2)(1,3)(1,4)......等对可能(2,6)(2,7)(7,8)等,那么如果我我找到了一个比1更富裕的人,我穿越了每个邻居1,然后我想每个邻居的邻居。这只在我存储结果时完成一次。

    Question Part 1

    Question Part 2

    编辑(添加问题文本) -

    Rounaq今年即将毕业。他将变得富有。非常丰富。如此富有,他决定拥有 一种衡量他丰富程度的结构化方法。因此他到城里去问人们他们的财富, 并记下这些信息。 Rounaq记下了这对(Xi; Yi),如果Xi拥有比Yi更多的财富。他还记下了 每个人的安静程度Ki。 Rounaq认为,吵闹的人是令人讨厌的。因此,为 他的每一位朋友艾,他都想确定那些拥有最嘈杂(最不安静)的人 财富超过艾。 请注意,“拥有更多财富”是一种传递性和反对称关系。因此,如果有更多的财富 比b,b有比c更多的财富,那么a比c有更多的财富。而且,如果一个人有更多的财富 b,那么b不能拥有比a更多的财富。 你在这个问题上的任务是帮助Rounaq确定人群中最吵闹的人 考虑到Rounaq从镇上收集的信息,他的每个朋友ai都有更多的财富。 输入 第一行包含T:测试用例的数量 每个测试用例都具有以下格式:

    N

    K1 K2 K3 K4 ::: Kn

    M

    X1 Y1

    X2 Y2

    。 。 。

    。 。 。

    XM YM

    A1

    A2

    。 。 。

    。 。 。

    AQ

    N:镇上的人数

    M:Rounaq能够获得财富的对数 信息

    问:Rounaq的朋友数量

    Ki:我的人的安静程度

    Xi有易:Rounaq已经记录下来了(一对不同的值)

    艾:Rounaq的第一个朋友

    对于每个Rounaq的朋友,打印一个整数 - 最嘈杂的人的安静程度,如果没有更富有的人为该朋友,则为-1。

1 个答案:

答案 0 :(得分:1)

XY对进行topological sort。然后从最富有的人那里向最富有的人进行迭代,并储存到目前为止看到的最吵闹的人:

less wealthy    ->    most wealthy
<- person with lowest K so far <-

然后,对于每个查询,二进制搜索第一个拥有比朋友更多财富的人。我们存储的价值是比朋友拥有更多财富的最吵闹的人。

更新

似乎我们不能依赖数据来进行完整的拓扑排序。在这种情况下,遍历图表中从已知最大到最少财富的部分,为每个人存储访问到目前为止看到的最嘈杂的人。您提供的示例可能如下所示:

  3 - 5
 /    |
1 - 2 |
   /  |
  4 --

遍历:

1 <- 3 <- 5
1 <- 2
4 <- 2
4 <- 5

(输入)

2 1
2 4
3 1
5 3
5 4
8 2 16 26 16

(查询和解决方案)

 3  4  3  5  5 
16  2 16 -1 -1