У меня есть следующая проблема:
Вам предоставляется N счетчиков, изначально заданных в 0, и у вас есть две возможные операции над ними:
- увеличение (X) - счетчик X увеличивается на 1,
- max_counter - все счетчики установлены на максимальное значение любого счетчика.
Дается непустой нуль-индексированный массив A из целых чисел M. Этот массив представляет собой последовательные операции:
- если 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? Извините за ужасное кодирование, я делаю эти упражнения, чтобы улучшить свое программирование. Спасибо!