-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathMaxCounters.php
More file actions
129 lines (102 loc) · 3.6 KB
/
Copy pathMaxCounters.php
File metadata and controls
129 lines (102 loc) · 3.6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
<?php
/*
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.
Write a function:
function solution($N, $A);
that, given an integer N and a non-empty zero-indexed array A consisting of M integers,
returns a sequence of integers representing the values of the counters.
The sequence should be returned as:
a structure Results (in C), or
a vector of integers (in C++), or
a record Results (in Pascal), or
an array of integers (in any other programming language).
For example, given:
A[0] = 3
A[1] = 4
A[2] = 4
A[3] = 6
A[4] = 1
A[5] = 4
A[6] = 4
the function should return [3, 2, 2, 4, 2], as explained above.
Assume that:
N and M are integers within the range [1..100,000];
each element of array A is an integer within the range [1..N + 1].
Complexity:
expected worst-case time complexity is O(N+M);
expected worst-case space complexity is O(N),
beyond input storage (not counting the storage required for input arguments).
Elements of input arrays can be modified.
*/
/**
* MaxCounters task.
*
* CODILITY ANALYSIS: https://codility.com/demo/results/trainingM72WFV-FTW/
* LEVEL: MEDIUM
* Correctness: 100%
* Performance: 100%
* Task score: 100%
*
* @param int $N N counters
* @param int[] $A Non-empty zero-indexed array A of M integers
*
* @return int[] Final values of counters
*/
function solution($N, $A)
{
// N counters, all have value 0 at start
$counters = array_fill(0, $N, 0);
// Array $A consists of M integers
$M = count($A);
// Used for setting all counters to max counter value, which becomes new lowest counters value
$newLowestCountersValue = 0;
// Used for tracking max counter value
$maxCounterValue = 0;
// Iteration through each array $A value
for ($i = 0; $i < $M; $i++) {
if ($A[$i] === ($N + 1)) {
// If array integer value is N + 1 then operation is max counter
$newLowestCountersValue = $maxCounterValue;
} else {
// Else operation is increase by 1
// If counter value is lower than maximum counter value, it must be set to max value
if ($counters[$A[$i] - 1] < $newLowestCountersValue) {
$counters[$A[$i] - 1] = $newLowestCountersValue;
}
$counters[$A[$i] - 1]++;
// Tracking if maximum counter value has changed
if ($counters[$A[$i] - 1] > $maxCounterValue) {
$maxCounterValue = $counters[$A[$i] - 1];
}
}
}
// Updating counters which are lower than maximum counter value
for ($i = 0; $i < $N; $i++) {
if ($counters[$i] < $newLowestCountersValue) {
$counters[$i] = $newLowestCountersValue;
}
}
return $counters;
}