Finde den Ninja-Index eines Arrays

8

Es ist ein interessantes Puzzle, dem ich begegnet bin, nach dem wir bei einem Array den Ninja-Index finden müssen.

Ein Ninja-Index wird durch diese Regeln definiert:

Ein Index K, so dass alle Elemente mit kleineren Indizes Werte kleiner oder gleich A [K] haben und alle Elemente mit größeren Indizes Werte größer oder gleich A [K] haben.

Betrachten Sie zum Beispiel:

A[0]=4, A[1]=2, A[2]=2, A[3]=3, A[4]=1, A[5]=4, A[6]=7, A[7]=8, A[8]=6, A[9]=9.

In diesem Fall ist 5 ein Ninja-Index, da A [r] & lt; = A [5] für r = [0, k] und A [5] & lt; = A [r] r = [ k, n].

Welchen Algorithmus sollen wir befolgen, um ihn in O (n) zu finden? Ich habe bereits eine Brute-Force-O (n ^ 2) -Lösung.

BEARBEITEN: Es kann mehr als einen Ninja-Index geben, aber wir müssen den ersten finden. Und falls es keine NI gibt, werden wir -1 zurückgeben.

    
h4ck3d 20.09.2012, 15:01
quelle

4 Antworten

8

Berechnen Sie Mindestwerte für alle Suffixe des Arrays und Maximalwerte für alle Präfixe. Mit diesen Daten kann jedes Element in O (1) auf Ninja überprüft werden.

    
Rafał Dowgird 20.09.2012, 15:06
quelle
2

Eine Python-Lösung, die O (3n) -Operationen benötigt

%Vor%     
etzourid 20.09.2012 16:34
quelle
2

Eine weitere Python-Lösung, die demselben allgemeinen Ansatz folgt. Vielleicht ein bisschen kürzer.

%Vor%

Ich denke, es könnte ein bisschen besser sein als die Liste-Kopier-Aktion, aber auf diese Weise ist es prägnanter.

    
tobias_k 20.09.2012 17:42
quelle
0

Dieser geradlinige Java-Code berechnet den Index ganz links mit der Eigenschaft "Alle Elemente sind nicht kleiner":

%Vor%

Fast derselbe Code berechnet den Index ganz links mit der Eigenschaft "Alle Elemente links sind nicht größer":

%Vor%

Wenn die Ergebnisse gleich sind, wird der Ninja-Index ganz links gefunden.

    
Victor Sorokin 25.09.2012 20:32
quelle