我有一个n个整数的数组A.我还有一个k(k 如果我采用最明显的方式,我会达到n * k复杂度。
数组A不能(不得)进行排序。 是否有更有效的方法来实现这一目标?
答案 0 :(得分:1)
是否有更有效的方法来实现这一目标?
是:将B
的元素放入HashSet
。循环遍历A
,如果您所在的元素包含在集合中,则将其增加3.这将具有O(n + k)复杂度。
例如:
Set<Integer> bSet = new HashSet<>(B.length);
for (int a : B) // O(k)
bSet.add(a);
for (int i = 0; i < A.length; i++) { // O(n)
if (bSet.contains(a[i]))
a[i] += 3;
}
答案 1 :(得分:0)
如果数组B可以排序 - 那么解决方案是显而易见的,排序它,然后你可以优化“包含”为log2(K),所以你的复杂性将是N * log2(k)
如果你不能对数组B进行排序 - 那么唯一的就是直接向前N * K
更新
真的忘记了bitmask,如果你知道你只有32位整数,并且有足够的内存 - 你可以存储大量的bitmask数组,“add”和“contains”总是会是O(1),但当然只有非常特殊的性能优化才需要它
答案 2 :(得分:0)
如果你的整数在你可以创建的范围内,并且数组的长度最大(例如0 <= A[i] and B[i] <= 65535
)那么你可以这样做
boolean [] constains = new boolean[65535];
for (int i = 0; i < k; i++){
constains[B[i]] = true;
}
for (int i = 0; i < n; i++){
if (constains[A[i]]){
A[i] += 3;
}
}
哪个是O(n + k)