给定两个数组,如何找到两个数组共有的最大元素?
我正在考虑对两个数组进行排序(n log n),然后对另一个数组中的一个排序数组(从较大的数组开始)中的每个元素执行二进制搜索,直到找到匹配为止。
例如:
a = [1,2,5,4,3]
b = [9,8,3]
Maximum common element in these array is 3
我们能比n log n做得更好吗?
答案 0 :(得分:10)
有一些额外的空间你可以在1个数组中散列,然后在另一个数组的每个元素上做一个包含,跟踪返回true的最大值。将是O(n)。
答案 1 :(得分:7)
您可以使用O(N)
空格
只需浏览第一个数组并将所有元素放在HashTable
中。这是O(N)
然后浏览第二个数组,跟踪当前最大值并检查该元素是否在HashTable
中。这也是O(N)
。
因此O(N)
O(N)
和HashTable
额外空间
Java中的示例:
public static int getMaxCommon(int[] a, int[] b){
Set<Integer> firstArray = new HashSet<Integer>(Arrays.asList(a));
int currentMax = Integer.MIN_VALUE;
for(Integer n:b){
if(firstArray.contains(n)){
if(currentMax < n){
currentMax = n
}
}
}
return currentMax;
}
答案 2 :(得分:3)
虽然它取决于特定语言中各种操作的时间复杂性,但是如何从数组创建集合并在两个集合的交集中找到最大值?按照Python中操作的时间复杂度,平均来说,设置分配的O(n),交叉点的O(n)和查找最大值的O(n)。所以平均情况是O(n)。
然而!最坏情况是O(len(a)* len(b)) - &gt; O(n ^ 2),因为集合交叉点的最坏情况时间复杂度。
此处有更多信息,如果您有兴趣:http://wiki.python.org/moin/TimeComplexity
答案 3 :(得分:1)
如果您已经知道数组中的数字范围,则可以执行计数排序,然后按照您的需要执行二进制搜索。这将产生O(n)运行时。
答案 4 :(得分:1)
伪代码:
sort list1 in descending order
sort list2 in descending order
item *p1 = list1
item *p2 = list2
while ((*p1 != *p2) && (haven't hit the end of either list))
if (*p1 > *p2)
++p1;
else
++p2;
// here, either we have *p1 == *p2, or we hit the end of one of the lists
if (*p1 == *p2)
return *p1;
return NOT_FOUND;
答案 5 :(得分:0)
不完美,但是一个简单的解决方案,O(len(array1)+ len(array2))
import sys
def find_max_in_common(array1, array2):
array1 = set(array1)
array2 = set(array2)
item_lookup = {}
for item in array1:
item_lookup[item] = True
max_item = -sys.maxsize
intersection = False
for item in array2:
if not item_lookup.get(item, None):
continue
else:
intersection = True
if item > max_item:
max_item = item
return None if not intersection else max_item