【问题标题】:Fastest method for counting the maximum number of unique values in deque计算双端队列中唯一值的最大数量的最快方法
【发布时间】:2016-06-11 12:29:27
【问题描述】:

我正在尝试找到最快的方法来计算从控制台获取的一系列 n 个整数的 m 大小子数组中唯一值的最大数量。有没有办法进一步优化这段代码?提前致谢,亚历克斯

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

【问题讨论】:

  • 只有最大值存储在count变量中,所以我认为不需要任何额外的逻辑
  • 啊,是的,对不起,没有正确阅读代码!

标签: java optimization count unique deque


【解决方案1】:

这是 O(NM)(假设 distinctO(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);
}

【讨论】:

  • 只需要一些小细节。可以处理相对较小的数字。此解决方案应更改为额外的HashMap 结构以进行进一步优化。
猜你喜欢
  • 1970-01-01
  • 2015-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-11
相关资源
最近更新 更多