【发布时间】:2016-01-22 21:22:13
【问题描述】:
这里有个问题:
假设我们有以下数组:
[1,2,9]
[3,6,7]
[4,11]
[8,10,12]
数组中的项目是唯一且有序的。任务是找到最短的序列长度,其中至少包含每个数组的一个元素,但这些元素应该一个接一个(没有间隙,不能是 [1,3])并且也是有序的。所以在这种情况下,答案是:
5 => [7,8,9,10,11]
有没有有效的方法来做到这一点?
【问题讨论】:
这里有个问题:
假设我们有以下数组:
[1,2,9]
[3,6,7]
[4,11]
[8,10,12]
数组中的项目是唯一且有序的。任务是找到最短的序列长度,其中至少包含每个数组的一个元素,但这些元素应该一个接一个(没有间隙,不能是 [1,3])并且也是有序的。所以在这种情况下,答案是:
5 => [7,8,9,10,11]
有没有有效的方法来做到这一点?
【问题讨论】:
你可能会使用两个指针算法(抱歉我没有找到任何参考)。复杂度是O(nlogn),n是所有数组中元素的总和。
首先,将所有元素放入一维数组中,并使用数组索引捐赠每个元素。就这样,
struct A{
int value;
int array_id;
};
然后,按值对元素进行排序(O(nlogn))。我们的问题发生了变化,以找到覆盖所有数组的最短连续序列。这可以通过两个指针算法来完成。复杂度为O(n)。
所以总复杂度是O(nlogn)。
【讨论】:
这可以通过以下方式轻松解决。
另请查看this 讨论。这是关于你的问题。 在那里你也可以找到 c++ 和 java 代码
【讨论】: