Mi è stata assegnata una matrice (di n elementi) e devo trovare l'elemento più piccolo sul lato destro di ciascun elemento che è maggiore di se stesso (elemento corrente).Il più grande elemento presente sul lato destro di ogni elemento di un array
For example :
Array = {8,20,9,6,15,31}
Output Array = {9,31,15,15,31,-1}
È possibile risolvere questo in O(n)
.? Ho pensato di attraversare l'array dal lato destro (a partire da n-2) e di costruire un albero di ricerca binaria di bilancio per gli elementi rimanenti, poiché la ricerca in esso per un elemento che è immediatamente maggiore dell'elemento corrente sarebbe O (logn).
Quindi complessità temporale sarebbe venuto fuori per essere O (n * (log (n)).
v'è un approccio migliore a questo problema?
Questo non è equivalente all'ordinamento, la ricerca della posizione di qualsiasi elemento 'a' è ciò che si fa in quicksort in ogni fase, e viene fatto lì in O (n). O ho frainteso la tua riduzione dall'ordinamento? – amit
Sembra buono per me, almeno per l'ordinamento di numeri distinti (che sono abbastanza sicuro è abbastanza? Non lo so). @amit: Dopo aver eseguito l'algoritmo su 'v' e' reverse (v) ', per ogni elemento, si conosce l'indice dell'elemento che dovrebbe apparire alla sua destra (è il prossimo elemento più piccolo alla sua destra, o il prossimo l'elemento più piccolo alla sua sinistra). Quindi, da qualsiasi elemento di partenza i, è possibile creare la parte della soluzione con indice> = i in tempo O (1) per elemento. Capovolgere il segno e ripetere ti darà la parte a sinistra (cioè con indice <= i). –
Capito, pensato che stai ottenendo una * singola * posizione di un elemento, che è fattibile in O (n). grazie per il chiarimento. – amit