在两个数组中搜索匹配项,无需额外内存
前几天我接受了亚马逊的采访,他们问我的一个问题与以下问题有关。
给定 2 个整数数组,其中包含任意数量的正数和负数元素,查找出现在两个数组中的数字。
我能够非常容易地解决这个问题,因此它具有计算复杂性,但不幸的是,这也将具有空间复杂性。这可以通过循环访问每个数组中的所有元素来完成,而无需额外的内存,但这是 。HashMaps
O(n)
O(n)
O(n^2)
面试官在我解释完方法后,问我是否可以想到一种在计算上是O(n)的方法,但不会使用任何额外的内存。我无法在飞行中想到任何东西,并且无法找到解决方案。有没有办法在线性时间中不使用额外的内存来查找这些值?HashMap
注意:我已经在CareerCup上发布了这个问题,但那里的每个人似乎都不明白我需要它来不使用额外的空间,并且它必须是计算性的。O(n)
这是我在面试时使用的代码。它有效,但只是不是空间的O(1)。
import java.util.*;
public class ArrayFun {
public static void main(String[] args) {
int[] a = {1,2,3,4};
int[] b = {2,5,6,7,3,2,2,2,2,1,2,2,2,2};
ArrayList<Integer> matches = ArrayFun.findMatches(a,b);
for (int i = 0;i<matches.size();++i) {
System.out.println(matches.get(i));
}
}
public static ArrayList<Integer> findMatches(int[] a, int[] b) {
HashMap<Integer,Integer> map = new HashMap<Integer,Integer>();
ArrayList<Integer> matches = new ArrayList<Integer>();
for (int i = 0;i<a.length;++i) {
map.put(a[i],0);
}
for (int i = 0;i<b.length;++i) {
if (map.get(b[i]) != null && map.get(b[i]) == 0) {
map.put(b[i],1);
matches.add(b[i]);
}
}
return matches;
}
}
此代码将返回
1,2,3
编辑:当我说没有额外的空间和O(1)时,我有点互换使用它们。通过没有额外的空间,我的意思是小占位符变量很好,但分配新数组不是。