def solution(M, A):
result = [0] * M
maxCount = 0
setAll = 0
for i in range(0,len(A)):
if (A[i] == M + 1):
setAll += maxCount
maxCount = 0
result = [0] * M
else:
result[A[i] - 1] += 1
if (result[A[i] - 1] > maxCount):
maxCount = result[A[i] - 1]
for j in range(0,len(result)):
result[j] += setAll
return result
A = [ 1, 1, 1, 1, 2, 3]
M = 2
print solution(M, A) # result = [ 4, 4 ]
A = [ 1, 2, 2, 4, 1, 1]
M = 3
print solution(M, A) # result = [ 4, 2, 2 ]
By my count, solution() loops through A N times and then loops result M times thus N+M. However, an online test said that it was instead N*M, leaving me stumped.
It is
O(M + N)
; there are no nested loops here. This can be reduced to the cost for the larger number; asymptotically, the smaller loop is not going to matter, making itO(N)
.First you loop over
A
elements (N
iterations), then separately you loop overM
elements.It is
O(N)
, because the there areN + M
loops for a given inputN, M
. That reduces to the larger of the two (let's say that isN
) for the purposes of time complexity, because we only take the most significant term. It would beO(N*M)
if the second loop was nested inside the first.