Nota: che può essere fatto su O(n)
in media, utilizzando un hash table.
set <- new hash set
for each x in array:
set.add(2*x)
for each x in array:
if set.contains(x):
return true
return false
Prova:
=>
Se ci sono 2 elementi a[i]
e a[j]
tale che a[i] = 2 * a[j]
, allora quando l'iterazione prima volta, abbiamo inserito 2*a[j]
al set quando si legge a[j]
. Nella seconda iterazione, troviamo che a[i] == 2* a[j]
è impostato e restituisce true.
< =
Se l'algoritmo restituito vero, allora trovato a[i]
tale che a[i]
è già nel set di seconda iterazione. Quindi, durante la prima iterazione, abbiamo inserito a[i]
. Questo può essere fatto solo se esiste un secondo elemento a[j]
tale che a[i] == 2 * a[j]
e abbiamo inserito a[i]
durante la lettura di a[j]
.
Nota:
Per riportare gli indici dei elemets, si può semplicemente utilizzare un hash-map invece di un insieme, e per ogni i
archivio 2*a[i]
come chiave e i
come valore.
Esempio:
Input = [4,12,8,10]
primo inserto per ogni x - 2x alla tabella hash, e l'indice.Otterrete:
hashTable = {(8,0),(24,1),(16,2),(20,3)}
Ora, sulla iterazione secondo articolo di controllare per ogni elemento se è nella tabella:
arr[0]: 4 is not in the table
arr[1]: 12 is not in the table
arr[2]: 8 is in the table - return the current index [2] and the value of 8 in the map, which is 0.
modo, l'uscita finale è 2,0 - come previsto.
(1) Complessità avviso:
Qui, O(n)
assume O(1)
funzione di hash. Questo non è sempre vero. Se assumiamo la funzione di hash O(1)
, possiamo anche supporre che l'ordinamento con radix-sort sia O(n)
, e usando una post-elaborazione di O(n)
[simile a quella suggerita da @SteveJessop nella sua risposta], possiamo anche ottenere O(n)
con smistamento- algoritmo basato.
Sto scegliendo questo come risposta corretta perché anche se la risposta di @amit era elegante, si presuppone di avere il doppio dello spazio e una funzione di hash di O (1). Se potessi scegliere due risposte avrei scelto anche la risposta di Steve. –
Ehi, hai ancora bisogno di tenere traccia degli indici originali, quindi hai ancora bisogno di spazio aggiuntivo :) –
@VictorParmar L'assegnazione non dice che è necessario restituire gli indici. "Controlla se ..." mi sembra che stia chiedendo una funzione booleana (quindi non è necessario ricordare gli indici). – sepp2k