2013-06-14 10 views
7

Fonte: Intervista Microsoft DomandaTrova l'elemento non duplicati in un array ordinato

Dato un array ordinato, in cui ogni elemento è presente due volte, tranne uno che è presente getta, abbiamo bisogno di trovare quell'elemento .

Ora un O standard (n) la soluzione è di fare un XOR di lista, che restituirà l'elemento non duplicati (dal momento che tutti gli elementi duplicati si annullano.)

E 'possibile risolvere il più rapidamente se sappiamo l'array è ordinato?

+7

Fare una "ricerca" binaria (piuttosto trasversale) sulla matrice, controllare entrambi i vicini, se bot sono diversi dal valore medio, si ha la soluzione. Questo è 'O (log n)'. –

+0

@ H2CO3 in che modo? I vicini non sarebbero sempre diversi? –

+0

@ZiyaoWei Nopeeeee! Io non parlo inglese. Se l'array è ordinato, ('1 1 2 2 3 4 4'), quindi un vicino è uguale al valore centrale. –

risposta

14

Sì, è possibile utilizzare il sortedness di ridurre la complessità a O(log n) facendo una ricerca binaria.

Poiché la matrice è ordinata, prima dell'elemento mancante, ciascun valore occupa gli spot 2*k e 2*k+1 nell'array (presupponendo l'indicizzazione basata su 0).

Così si va al centro della matrice, dire indice di h, e controllare sia indice di h+1 se h è ancora, o se h-1h è dispari. Se l'elemento mancante viene dopo, i valori in queste posizioni sono uguali, se viene prima, i valori sono diversi. Ripeti fino a trovare l'elemento mancante.

+3

Questo è geniale. Bella risposta! – templatetypedef

+1

E ora stai svegliando per la risposta che ho postato nel mio commento 3 minuti fa. Sill me :) –

+3

@ H2CO3 Ma lui spiega l'algoritmo più chiaro :) –

6

Esegui una "ricerca" binaria (piuttosto trasversale) sull'array, controlla entrambi i vicini, se entrambi sono diversi dal valore nel mezzo, hai la soluzione. Questo è O(log n).

+0

se entrambi sono uguali, allora? .. vado a destra oa sinistra? – Spandan

+1

non hai capito la domanda, penso! – Spandan

+2

@Spandan l'ho capito perfettamente. –

Problemi correlati