【发布时间】:2020-03-08 14:06:23
【问题描述】:
我真的很高兴找到这样一个简单的解决方案,直到我被复杂性所困扰。我可以做些什么来降低复杂性,如果有的话,或者我需要找到不同的方法吗?
问题:
给你 N 个计数器,初始设置为 0,你有两种可能的操作:
increase(X) - 计数器 X 增加 1, max counter - 所有计数器都设置为任何计数器的最大值。 给出了一个由 M 个整数组成的非空数组 A。这个数组代表连续的操作:
if A[K] = X, such that 1 ≤ X ≤ N,那么操作K就是增加(X),
if A[K] = N + 1 然后操作 K 是最大计数器。
例如,给定整数 N = 5 和数组 A 使得:
A[0] = 3
A[1] = 4
A[2] = 4
A[3] = 6
A[4] = 1
A[5] = 4
A[6] = 4
每次连续操作后计数器的值将是:
(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)
目标是计算所有操作后每个计数器的值。
写一个函数:
def solution(N, A)
给定一个整数 N 和一个由 M 个整数组成的非空数组 A,返回一个表示计数器值的整数序列。
结果数组应作为整数数组返回。
例如,给定:
A[0] = 3
A[1] = 4
A[2] = 4
A[3] = 6
A[4] = 1
A[5] = 4
A[6] = 4
该函数应返回 [3, 2, 2, 4, 2],如上所述。
为以下假设编写一个有效的算法:
N 和 M 是 [1..100,000] 范围内的整数; 数组 A 的每个元素都是 [1..N + 1] 范围内的整数。
我的解决方案复杂度为 O(N*M)
def solution(N,A):
# Step 1 - initialise
counter = [0]*N
counter_label = list(range(1,N+1))
counter_dict = dict(zip(counter_label,counter))
# Step 2a iterate through A
for i in range(len(A)):
# Step 2B step through each counter
for l in counter_label:
if A[i] > N:
counter_dict[l] = max(counter_dict.values())
if A[i] == l:
counter_dict[l] += 1
return list(counter_dict.values())
我的函数为示例生成了正确的解决方案,但是对于大量数组会超时:
A = [3,4,4,6,1,4,4]
N = 5
print(solution(N,A))
[3, 2, 2, 4, 2]
【问题讨论】:
-
你的算法要解决什么问题? “Codility Max Counters”对不熟悉该问题的人没有任何意义,因此请编辑您的问题以解释这一点(不要只是添加链接)。
-
另外,您的代码只是一个函数定义。请发布minimal reproducible example 示例输入和预期输出
-
谢谢!更新了您的反馈
标签: python-3.x time-complexity