我试图找到一种最快的方法来计算从控制台获取的一系列n个整数的m个大小的子阵列中的唯一值的最大数量。有没有办法进一步优化此代码?提前感谢,Alex
import java.util.*;
public class test {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
Deque deque = new ArrayDeque<>();
int n = in.nextInt();
int m = in.nextInt();
long count = 0, c = 0;
for (int i = 0; i < m; i++) deque.addFirst(in.nextInt());
count = deque.stream().distinct().count();
for (int i = 0; i < n - m; i++) {
count = Math.max(count, deque.stream().distinct().count());
deque.removeLast();
deque.addFirst(in.nextInt());
}
System.out.println(count);
}
}
答案 0 :(得分:1)
这是 O(NM)(假设distinct
是 O(M))。应该可以在 O(N)中通过跟踪当前窗口内非零计数的值的数量来执行此操作。
伪代码:
for (int i = M; i < N; i++) {
counts[x[i-M]]--;
if (counts[x[i-M]] == 0) {
nonzero--;
}
if (counts[x[i]] == 0) {
nonzero++;
}
counts[x[i]]++;
maxNonzero = max(maxNonzero, nonzero);
}