Monotonic-Pair - Codility

Ich war gerade bei Codility, und lief in eine Aufgabe, für die ich nicht finden können, eine Lösung im gezielten O(n) Effizienz; meine Lösung läuft in O(n2). Ich würde mich sehr freuen, wenn jemand nur mir einen Tip geben, wie man es schneller laufen. Hier ist die Aufgabe.

Eine nicht-leere null-indiziert Ein array aus N ganzen zahlen gegeben ist.

Einen monotonic_pair ist ein paar ganzer zahlen (P, Q), so dass 0 ≤ P ≤ Q < N und A[P] ≤ A[Q].

Das Ziel ist, zu finden, die monotonic_pair, deren Indizes sind am weitesten auseinander. Genauer gesagt, sollten wir maximieren den Wert Q − P. Es ist ausreichend zu finden, nur der Abstand.

Betrachten Sie beispielsweise Ein array mit:

A[0] = 5
A[1] = 3
A[2] = 6
A[3] = 3
A[4] = 4
A[5] = 2

Gibt es elf monotonic_pairs: (0,0), (0, 2), (1, 1), (1, 2), (1, 3), (1, 4), (2, 2), (3, 3), (3, 4), (4, 4), (5, 5). Der größte Abstand beträgt 3, im paar (1, 4).

Schreiben Sie eine Funktion:

Klasse Lösung { public int Lösung(int[] A); }

dass, da eine nicht-leere null-indizierten array A von N ganzen zahlen, gibt die größte Distanz innerhalb der monotonic_pairs.

Beispiel:

A[0] = 5
A[1] = 3
A[2] = 6
A[3] = 3
A[4] = 4
A[5] = 2

die Funktion zurückgeben sollte 3, wie oben erläutert.

Davon ausgehen, dass:

N ist eine ganze Zahl im Bereich [1..300,000];
jedes element von array A ist eine ganze Zahl im Bereich [-1,000,000,000..1,000,000,000].
Komplexität:

erwartete worst-case Zeitkomplexität ist O(N);
erwartete worst-case-Raum-Komplexität ist O(N), über die Eingabe-Speicher (nicht mitgerechnet den benötigten Speicher für die input-Argumente).
Die Elemente des Eingabe-arrays geändert werden kann.

Und meine 1. Idee, Lösung (läuft in O(n2)):

    public static int solution(int[] A) {
    int max = 0;
    for(int i=0; i<A.length-1; i++) {
        for(int j=i+1; j<A.length; j++) {
            if(A[j] >= A[i] &&
                    (j - i) >= max) {
                max = j - i;
            }
        }
    }
    return max;
}
InformationsquelleAutor Whizzil | 2014-04-16
Schreibe einen Kommentar