我有以下问题:
您有 N 个计数器,最初设置为 0,您可以对它们进行两种可能的操作:
- increase(X) - 计数器 X 增加 1,
- max_counter - 所有计数器都设置为任何计数器的最大值。
给出了一个由 M 个整数组成的非空零索引数组 A。该数组表示连续操作:
- 如果 A[K] = X,使得 1 ≤ X ≤ N,那么操作 K 是增加(X),
- 如果 A[K] = N + 1 则操作 K 为 max_counter。
例如,给定整数 N = 5 和数组 A 使得:
A[0] = 3
A[1] = 4
A[2] = 4
A[3] = 6
A[4] = 1
A[5] = 4
A[6] = 4
每次连续操作后计数器的值将是:
(0, 0, 1, 0, 0)
(0, 0, 1, 1, 0)
(0, 0, 1, 2, 0)
(2, 2, 2, 2, 2)
(3, 2, 2, 2, 2)
(3, 2, 2, 3, 2)
(3, 2, 2, 4, 2)
目标是在所有操作之后计算每个计数器的值。
我做了以下解决方案,但它在 O(NK) 处运行,其中 K = 数组 A 的长度。
public int[] solution(int N, int[] A) {
int[] result = new int[N];
int maximum = 0;
for (int K = 0; K < A.Length; K++)
{
if (A[K] < 1 || A[K] > N + 1)
throw new InvalidOperationException();
if (A[K] >= 1 && A[K] <= N)
{
result[A[K] - 1]++;
if (result[A[K] - 1] > maximum)
{
maximum = result[A[K] - 1];
}
}
else
{
// inefficiency here
for (int i = 0; i < result.Length; i++)
result[i] = maximum;
}
}
return result;
}
谁能告诉我如何用 O(N + K) 更好地做到这一点,其中 K 是数组 A 的长度?抱歉,编码可能很糟糕,我正在做这些练习来改进我的编程。谢谢!