前几天我接受了亚马逊的采访,他们问我的一个问题与以下问题有关。
给定 2 个整数数组,包含任意数量的正负元素,找出出现在两个数组中的数字。
我能够很容易地解决这个问题,HashMaps
所以它会有O(n)
计算复杂性,但不幸的是,这也会有O(n)
空间复杂性。这可以通过遍历每个数组中的所有元素来完成,而无需额外的内存,但这将是O(n^2)
.
面试官在我解释完该HashMap
方法后,问我是否可以想出一种在计算上 O(n) 但不会使用任何额外内存的方法。我无法在飞行中想到任何,也无法找到解决方案。有没有办法在线性时间内找到这些值而不使用额外的内存?
注意:我已经在 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) 时,我有点交替使用它们。没有额外的空间,我的意思是小的占位符变量很好,但分配新数组不是。