-
Notifications
You must be signed in to change notification settings - Fork 1
/
lesson4_3_MaxCounters.rb
62 lines (49 loc) · 1.71 KB
/
lesson4_3_MaxCounters.rb
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
# 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 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:
# def solution(n, a)
# that, given an integer N and a non-empty array A consisting of M integers, returns a sequence of integers representing the values of the counters.
# Result array should be returned as an array of integers.
# 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.
# Write an efficient algorithm for the following assumptions:
# 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].
def solution(n, a)
max = 0
offsets = a.inject(Hash.new(max)) do |acc, el|
next Hash.new(max) if el == n+1
acc[el] +=1
max = acc[el] if max < acc[el]
acc
end
(1..n).map{|i| offsets[i]}
end