我正在努力优化过去的亚马逊面试问题,涉及DAG。
这是我尝试过的(代码很长,我宁愿解释一下) -
基本上,由于图是一个DAG,并且因为它是一个传递关系,所以每个节点的简单遍历就足够了。
因此,对于每个节点,我会通过传递性遍历所有可能性来获得结束顶点,然后比较这些结束顶点以获得 最吵闹的人。
在我的第二步中,我实际上在步骤2中为遍历的所有顶点找到了一个这样的(可能是唯一的)最嘈杂的人。所以我在映射中记住所有这些并标记顶点访问的遍历。
所以我基本上维护了图表的邻接列表,访问/非访问映射和输出映射(每个顶点最嘈杂的人)。
上面的代码有效但由于我无法测试是否有测试用例,它可能/可能没有通过时间限制。是否有更快的解决方案(可能使用DP)。我觉得我没有充分利用传递和反对称条件。
显然,我不会检查一个人比现在的人富裕的情况。但是,例如,如果我有像 - (1,2)(1,3)(1,4)......等对可能(2,6)(2,7)(7,8)等,那么如果我我找到了一个比1更富裕的人,我穿越了每个邻居1,然后我想每个邻居的邻居。这只在我存储结果时完成一次。
编辑(添加问题文本) -
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。
答案 0 :(得分:1)
对X
,Y
对进行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