Codility Maxcountersers in Python
算法复杂度分析
情况 | 时间复杂度 | 空间复杂度 |
---|---|---|
最优 | O(N+M) | O(N) |
平均 | O(N+M) | O(N) |
最差 | O(N+M) | O(N) |
算法分析
若要达到最差情况下的时间复杂度为O(N+M),那就意味着不能在A[K] = N + 1
时依次将每个counter
的值置为当前counters
数组的最大值。因为max counter操作的复杂度为O(N)且需要嵌套在复杂度为O(M)的循环中,这样算法的复杂度至少为O(NM)。也就以为着当A[K] = N + 1
时,我们不能立即执行max counter操作。借用下惰性求值的概念,只有在真的需要某个counter
值的情况的下才执行计算。这就需要建立两个变量,max_A
记录当前counters
的最大值,lastUpdate
记录上一次执行max counter操作时max_A
的值。这样只有当A[K] = N + 1
时,才把max_A
的值赋值给lastUpdate
。而当A[i] < N+1
时,则要根据lastUpdate
的值来更新counter
和max_A
的值。
最后在返回所counters
数组值之前,需要根据lastUpdate
的值对每个counter的值进行计算
源代码
1 | def solution(N, A): |