Solution to Max-Counters by codility | Code Says
We could use lazy-write to improve the performance. When receiving the max_counter command, we record the current-max value, but do not change the list content. Only when we are going to return the list or increace a specific element, we will apply the stored value to the corresponding element(s).
http://codility-lessons.blogspot.com/2014/07/lesson-2maxcounters.html
http://jimii.github.io/blog/2014/09/19/codility-counting-elements-maxcounters/
Read full article from Solution to Max-Counters by codility | Code Says
Lesson 2 - Counting Elements:
You are given N counters, initially set to 0, and you have two possible operations on them:
- increase(X) − counter X is increased by 1,
- max counter − all counters are set to the maximum value of any counter.
A non-empty zero-indexed array A of M integers is given. This array represents consecutive operations:
- if A[K] = X, such that 1 ≤ X ≤ N, then operation K is increase(X),
- if A[K] = N + 1 then operation K is max counter.
For example, given integer N = 5 and array A such that:
A[0] = 3 A[1] = 4 A[2] = 4 A[3] = 6 A[4] = 1 A[5] = 4 A[6] = 4
the values of the counters after each consecutive operation will be:
(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)
The goal is to calculate the value of every counter after all operations.
http://www.martinkysel.com/codility-maxcounters-solution/
The idea is to perform the specified operation as stated. It is not required to iterate over the whole array if a new value is set for all the values. Just save the value and check it when an increase on that position is performed.
vector<
int
> solution(
int
N, vector<
int
> &A) {
vector<
int
> sol;
int
current_max = 0;
int
last_increase = 0;
for
(
int
i=0; i<N;i++){
sol.push_back(0);
}
for
(unsigned
int
i=0; i<A.size();i++){
if
(A[i] > N) {
last_increase = current_max;
}
else
{
sol[A[i]-1] = max(sol[A[i]-1], last_increase);
sol[A[i]-1]++;
current_max = max(current_max, sol[A[i]-1]);
}
}
for
(
int
i=0; i<N;i++){
sol[i] = max(sol[i], last_increase);
}
return
sol;
}
We could use lazy-write to improve the performance. When receiving the max_counter command, we record the current-max value, but do not change the list content. Only when we are going to return the list or increace a specific element, we will apply the stored value to the corresponding element(s).
def solution(N, A):
result = [0]*N # The list to be returned
max_counter = 0 # The used value in previous max_counter command
current_max = 0 # The current maximum value of any counter
for command in A:
if 1 <= command <= N:
# increase(X) command
if max_counter > result[command-1]:
# lazy write
result[command-1] = max_counter
result[command-1] += 1
if current_max < result[command-1]:
current_max = result[command-1]
else:
# max_counter command
# just record the current maximum value for later write
max_counter = current_max
for index in range(0,N):
if result[index] < max_counter:
# This element has never been used/updated after previous
# max_counter command
result[index] = max_counter
return result
A straightforward solution is easy as following. But the expected worst-case time complexity cannot be guaranteed.http://codility-lessons.blogspot.com/2014/07/lesson-2maxcounters.html
http://jimii.github.io/blog/2014/09/19/codility-counting-elements-maxcounters/
Read full article from Solution to Max-Counters by codility | Code Says