次の問題があります。
最初は 0 に設定された N 個のカウンターが与えられ、それらに対して 2 つの操作が可能です。
- 増加(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)
目標は、すべての操作の後にすべてのカウンターの値を計算することです。
私は次の解決策を実行しましたが、K = 配列 A の長さである O(NK) で実行されます。
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;
}
K が配列 A の長さである場合、O(N + K) を使用してこれをより適切に行う方法を誰かに教えてもらえますか? ひどいコーディングで申し訳ありませんが、プログラミングを改善するためにこれらの演習を行っています。ありがとう!