找到两个整数数组的最长交集

时间:2011-10-19 02:53:44

标签: java algorithm

我有这个问题,但不知道在时间复杂性和空间复杂性方面解决它的最佳方法是什么。    假设我有两个整数数组

   a={1,2,3,4,5}
   b={2,3,4,5,6}

当然不一定要排序。

所以问题是如何找到2,3,4,5?最好有一些代码。提前致谢

4 个答案:

答案 0 :(得分:2)

为什么我们在这里需要DP?问题说找到最长的交叉点,而不是任何交叉点。我错过了一点吗?

有很多解决方案。

int [] a = {...}; // n elements  
int [] b = {...}; // m elements  

您可以在字典中存储一个数组,并为另一个数组中的每个元素检查字典。那O(n)。由于字典,这将花费你更多的空间。并且它不是就地的

另一种解决方案是针对a中的每个元素,你可以对b进行线性搜索。这是O(n.m)

另一个是;如果你对两个数组进行排序。然后对于一个数组中的每个元素,在另一个数组中进行二进制搜索。你会发现两个的交集。这将是mlogn + nlognnlogm + mlogm

我们真的需要DP吗?

答案 1 :(得分:1)

这实际上是一个非常受欢迎的编程问题。有一种动态编程方法来解决它。您可以在http://en.wikipedia.org/wiki/Longest_common_subsequence_problem

查看更多相关信息

答案 2 :(得分:1)

我希望这个链接可以解决您的问题。 您必须编写一个常用功能,它将在两个数组中显示常用数字。 并且它仅使用一个用于循环。这就是为什么它的复杂性只是 O(N)。

Find common numbers.

代码在C中。但我希望你能理解逻辑。

答案 3 :(得分:0)

首先我们应该对数组进行排序,然后我们应该使用二进制搜索来找到这个数组的交集。 为什么?因为如果我们搜索交叉点,没有排序,我们的算法费力将是N^2,但如果我们在搜索之前对数组进行排序,那么我们将得到[log_2(N)N + ( N(log_2(N)) up to N^2 )]。 我的方法对大多数样本都很有用