在线性时间复杂度中查找两个数组中的公共元素

时间:2016-08-12 15:35:22

标签: arrays algorithm time-complexity intersection

我知道这类问题已经在社区中重复提出,但我的问题与其他问题没什么不同。

我今天面对一家知名公司的采访。他们问我两个技术问题,其中一个问题是......

我已经给出了两个未分类的长度数组,他们要求我找到数组的常用元素,但使用时间复杂度为O(n)的算法。

没有额外的语言相关支持。

我向他们展示了一个时间复杂度为O(n * log(n))的算法,但他们并不满意。 我只想知道如果存在任何此类算法。

4 个答案:

答案 0 :(得分:5)

您可以使用散列图来存储第一个数组的所有元素(以及它们的计数以处理重复元素的情况)。

然后遍历第二个数组并检查它们是否存在于hashmap中。 理想情况下,时间复杂度为O(2n)。因为放一个元素&从中检索是在O(1)时间。

您实现了O(n)的时间复杂度,但您的space complexity也变为O(n)。

答案 1 :(得分:1)

您可以使用HashSet(在C ++中它将是unordered_multiset)来存储第一个数组的元素,然后迭代第二个数组找到HashTable中存在的元素。由于访问元素平均具有恒定的时间复杂度,因此该算法将在O(n)中运行。

答案 2 :(得分:0)

在评论和其他答案的帮助下,我发现在O(n)中没有可能的方法在没有使用 C ++中的HashMap 设置的情况下这样做在Python中(这实际上是语言支持和增加空间复杂性)。

所以,这是python中的解决方案:

list1 = [4,2,5,7,1]
list2 = [8,2,4,1,6]

ans =  list(set(list1) & set(list2))
print 'Common Elements: ',ans

>>> Common Elements:  [1, 2, 4]

答案 3 :(得分:0)

public static void commonElementsInTwoArrays() {
        int[] arr1= {4,6,8,9};
        int[] arr2= {4,6,8,7};
        int i=0,j=0;

        while(i<arr1.length & j<arr2.length) {
            if(arr1[i]==arr2[j]) {
                System.out.println(arr1[i]);
                i++;
                j++;
            }else if(arr1[i]<arr2[j]) {
                i++;
            }else {
                j++;
            }
        }
    }