Was ist falsch mit dieser Lösung für die Max-Zähler codility Herausforderung

Also ich habe gehen durch die tests auf codility und etwas haben, hängt mit dem "Max-Zähler" (link https://codility.com/demo/take-sample-test/max_counters). Meine erste und naheliegende Lösung war die folgende:

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

das funktioniert ganz gut, aber zuviel Zeit in Anspruch nimmt, aufgrund der Tatsache, dass jeder Aufruf von max-Zähler füllt eine ganze Palette.

So kam ich auf die folgende Lösung scheint zu funktionieren ok für kleine Eingänge, aber zufällig falsche Ergebnisse liefert für mittlere und große Unternehmen.

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

Ich kann nicht scheinen, um herauszufinden, was falsch mit es.

Edit: Ergebnis - http://codility.com/demo/results/demoQA7BVQ-NQT/

  • Unbounded für dein problem, aber in python geben, die Sie nicht brauchen, semi collon.
  • Das ist richtig. Noch nicht verwendet python in eine Weile.
  • Was ist der Zweck der letzten Schleife ?
  • Ich verstehe es nicht. Der einzige Weg, um den gleichen Wert für den Zähler ist A[K]=N+1 . Warum der Vergleich mit der last-update jedes element der counter ?
  • Es ist zu vermeiden, aktualisieren Sie das gesamte array each-Schleife und statt dass man es nur einmal nach der Schleife, für diejenigen Schalter, die nicht vorhanden waren und die in das Eingabe-array. Wenn Sie print A, current_max, last_update each-Schleife werden Sie sehen, was Los ist.
  • E. g. Eingang (3, [3,3,4,3]) wird in (0,0,1) -> (0,0,2) -> (0,0,2) -> (0,0,3). Letzte loop wird es (2,2,3), das ist die korrekte Antwort.

InformationsquelleAutor jaho | 2013-12-10
Schreibe einen Kommentar