用于计算双端队列中唯一值的最大数量的最快方法

时间:2016-06-11 12:29:28

标签: java optimization count unique deque

我试图找到一种最快的方法来计算从控制台获取的一系列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);
    }
}

1 个答案:

答案 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);
}