我有这个问题,但不知道在时间复杂性和空间复杂性方面解决它的最佳方法是什么。 假设我有两个整数数组
a={1,2,3,4,5}
b={2,3,4,5,6}
当然不一定要排序。
所以问题是如何找到2,3,4,5?最好有一些代码。提前致谢
答案 0 :(得分:2)
为什么我们在这里需要DP?问题说找到最长的交叉点,而不是任何交叉点。我错过了一点吗?
有很多解决方案。
int [] a = {...}; // n elements
int [] b = {...}; // m elements
您可以在字典中存储一个数组,并为另一个数组中的每个元素检查字典。那O(n)
。由于字典,这将花费你更多的空间。并且它不是就地的
另一种解决方案是针对a中的每个元素,你可以对b进行线性搜索。这是O(n.m)
另一个是;如果你对两个数组进行排序。然后对于一个数组中的每个元素,在另一个数组中进行二进制搜索。你会发现两个的交集。这将是mlogn + nlogn
或nlogm + mlogm
我们真的需要DP吗?
答案 1 :(得分:1)
这实际上是一个非常受欢迎的编程问题。有一种动态编程方法来解决它。您可以在http://en.wikipedia.org/wiki/Longest_common_subsequence_problem
查看更多相关信息答案 2 :(得分:1)
我希望这个链接可以解决您的问题。 您必须编写一个常用功能,它将在两个数组中显示常用数字。 并且它仅使用一个用于循环。这就是为什么它的复杂性只是 O(N)。
代码在C中。但我希望你能理解逻辑。
答案 3 :(得分:0)
首先我们应该对数组进行排序,然后我们应该使用二进制搜索来找到这个数组的交集。
为什么?因为如果我们搜索交叉点,没有排序,我们的算法费力将是N^2
,但如果我们在搜索之前对数组进行排序,那么我们将得到[log_2(N)N + ( N(log_2(N)) up to N^2 )]
。
我的方法对大多数样本都很有用