您将获得
n
对数字。在每对中,第一个数字总是小于第二个数字。当且仅当(c,d)
小于(a,b)
时,b
对才能c
。可以以这种方式形成对的链。找到形成的最长链对。
我在接受亚马逊采访时得到了这个问题,但无法找出答案,只是它与LIS problem有关。
答案 0 :(得分:12)
因为每个(X,Y)对的两个值必须按顺序排列(X
鉴于此样本数据:
(15,40) (5,8) (1,10) (6,8) (9,20) (2,4) (36,37) (34,35) (9,14) (30,31)
按Y排序:
(2,4) (6,8) (5,8) (1,10) (9,14) (9,20) (30,31) (34,35) (36,37) (15,40)
然后循环,如果其X大于链中的最后一个Y,则向链中添加一对,否则忽略它。
请注意,在此示例中,(6,8)
恰好在(5,8)
之前排序。只要X值满足大于前一个Y的条件,当Y值相等时,为链选择哪一对并不重要。
这是一个图表,显示排序的对作为数字线上方的条形图。从第一对(2,4)
开始,每个添加到底部链的颜色为黄色。在视觉上,灰色的那些被跳过,因为它有一个黄色的“在路上”被放入链中(重叠的值)。
证明: 在链中包含更多对的唯一方法是用具有较小Y值的对替换一对,以允许下一对具有较小的X值,可能适合之前不适合的另一对。如果用具有相同Y值的一对替换一对,则什么也得不到。如果替换的Y值较大,那么你所做的一切都可能会阻挡一些之前适合的对。
由于这些对已按Y值排序,因此您永远不会找到具有较小Y的替换。在排序对中查找“向前”,它们将具有相同或更大的Y值。看起来“向后”,最初从链中消除的任何因素都是因为X值不够高,情况仍然如此。
答案 1 :(得分:2)
我们可以从Brian的方法开始,根据y值对所有对进行排序。它将确保上一对X
答案 2 :(得分:1)
首先,这个问题可以看作是二维网格上的绘图点,其中每个点的x坐标小于该点的y坐标。现在你被要求找到最长的链,使得每个第i + 1点都在第i个点的上方和右边(并且第i个点的y坐标小于i +的x坐标)第1点)。
现在让我们首先根据他们的x坐标对点进行排序。然后我们开始从最低x坐标开始访问分类点,如果x坐标有一个平局,那么我们将首先访问y坐标更高的点。现在举个例子,如果我们正在处理第i个点,我们知道已经访问过的所有点都有第一个x坐标的低或相似的坐标。因此,第i点的最长链末端将是我们已经得到的最长链,其中y坐标< = x当前点的坐标。
我们可以使用像分段树或二进制索引树这样的高效数据结构来有效地完成它。
此解决方案的运行时间为:O(NlgN)其中N是点数(给定问题中的对)。
答案 3 :(得分:0)
解决这个问题的一个基本方法是创建一个树,其中每个节点都是一对,并在合法时构造从一个节点到另一个节点的有向边(即“一对(c,d)可以跟随(a,b)当且仅当b小于c“)。您可以从每个节点执行修改后的宽度优先遍历,跟踪该节点中最长路径的长度,完成后可以查看所有节点以找到最长路径。
答案 4 :(得分:0)
在我看来,最长链的一个特征是它最小化任何两个相邻元组的总跨度(以最大化任何范围的可能元组的数量)。
在这种情况下,正如Brian Stephens所建议的那样,我们只需要按第二个数字排序,升序(以保证搜索下一个元组时的最小跨度),并从排序列表中的第一个元组开始构建链。
我们可以通过假定如果S(0)是从第一个元组开始的链,证明这个解是最优的,那么存在一个S(i),其中i不在S(0)中,它比S(0);因此,链S(i + 1)也比S(1)长。我们知道i的开始必须在i-1结束之前,否则它将包含在S(0)中。现在,如果i-1的末尾等于i的末尾,则S(i + 1)将成为S(0)的一部分,这与我们的前提相矛盾。或者,如果i的结尾大于i-1的结尾,则S(i)将包括在S(0)中。由于列表按此属性排序,因此i的结尾不能小于i-1的结尾。