【发布时间】:2013-12-28 16:48:58
【问题描述】:
所以我一直在进行关于 codility 的测试,并被“最大计数器”测试卡住了(链接 https://codility.com/demo/take-sample-test/max_counters)。我的第一个也是显而易见的解决方案如下:
def solution(N, A):
counters = N * [0];
for a in A:
if 1 <= a <= N:
counters[a - 1] += 1;
elif a == N + 1:
counters = N * [max(counters)];
return counters
这很好用,但是会花费太多时间,因为每次调用 max counters 都会填满整个数组。
所以我想出了以下解决方案,它似乎适用于小型输入,但随机地为中型和大型输入提供不正确的结果。
def solution(N, A):
counters = N * [0];
current_max = 0;
last_update = 0;
for a in A:
if 1 <= a <= N:
counters[a - 1] += 1;
if counters[a - 1] < last_update:
counters[a - 1] = last_update + 1;
if counters[a - 1] > current_max:
current_max = counters[a - 1];
elif a == N + 1:
last_update = current_max;
for i in xrange(len(counters)):
if counters[i] < last_update:
counters[i] = last_update;
return counters
我似乎无法弄清楚它有什么问题。
【问题讨论】:
-
对你的问题没有限制,但在 python 中你不需要分号。
-
没错。好久没用python了。
-
最后一个循环的目的是什么?
-
我不明白。将相同值放入所有计数器的唯一方法是 A[K]=N+1 。为什么要与最后更新计数器的每个元素进行比较?
-
这是为了避免每次循环都必须更新整个数组,而是在循环后只更新一次,对于那些输入数组中不存在的计数器。如果你
print A, current_max, last_update每个循环,你会看到发生了什么。