这是一个我试图解决的问题。
假设您有2条主要道路A和B相互平行。 现在我们有一组道路R,它们在A上都有一个端点,在B上有另一个端点。 R中没有一条道路在任何一条道路上共享一个终点。因此,如果R中存在r Roads,则有2个不同的端点。 除此之外,只要开始和结束在A和B的无线电,这些道路可以伸展多长,走向对角线,平行或任何方向。 假设我们可以检查2条道路是否在O(1)时间内相交。
Q1)找出R中最大的连续道路子集,其中没有两条道路相交,不相交。该算法应在O(n log n)
中运行Q2)与Q1相同但现在我们假设2r个不同的端点位于由x 2 + y 2 = 1
该算法应在O(n 3 )或更低的情况下运行。
到目前为止我的方法 我尝试用q1的2个端点中的最小值对道路进行分类,这样我们就可以在开头的最左边开始道路。 然后我会遍历它们,并且只检查两条终点的最小点在迭代道路的最小终点之后开始的道路并且减少那些道路并再次递归地调用该函数。
但我不确定这是如何运作的。我不确定它的O(n log n)
对于q2,我不知道。
我有一种感觉,这可以通过动态编程完成,我错过了某种数据结构,我可以轻松地解决这个问题。 请帮忙。
答案 0 :(得分:2)
道路A上有N个终点,道路B上有N个终点。
根据第一个端点对R中的道路进行排序,并准备第二个端点的列表A.
例如,如果我们有道路:
1->10
8->7
5->6
我们会将第一个端点排序为:
1->10
5->6
8->7
并准备一个包含第二个端点的列表A:
A = [10,6,7]
找到非重叠道路的最大子集相当于找到此阵列中增长最长的序列。
查找longest increasing subsequence是一种带有O(nlogn)解决方案的标准算法。
在这种情况下,最长的增加子序列是长度为2的[6,7],所以答案是2。