Uwaga: , które mogą być wykonane na O(n)
średnio, stosując 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
Dowód:
=>
Jeśli istnieją 2 elementy a[i]
i a[j]
takie, że a[i] = 2 * a[j]
, następnie podczas iteracji po raz pierwszy, możemy dodaje 2*a[j]
do zestawu, gdy czytamy a[j]
. W drugiej iteracji stwierdzamy, że a[i] == 2* a[j]
jest w zestawie i zwraca true.
< =
Jeżeli algorytm powrócił prawda, to okaże się, że taki a[i]
a[i]
jest już w komplecie w drugiej iteracji. Tak więc, podczas pierwszej itetacji - wstawiliśmy a[i]
. To można zrobić tylko wtedy, gdy jest drugi element a[j]
taki, że a[i] == 2 * a[j]
, i wstawiliśmy a[i]
podczas czytania a[j]
.
Uwaga:
W celu powrotu indeksom elemets, można po prostu użyć hash-mapy zamiast zestawu, a dla każdego i
sklepie 2*a[i]
jako klucz i i
jako wartości.
przykład:
Input = [4,12,8,10]
pierwsza wkładka dla każdego x - 2X do tabeli mieszania i indeksu.Dostaniesz:
hashTable = {(8,0),(24,1),(16,2),(20,3)}
Teraz na secod iteracji sprawdzić dla każdego elementu, jeśli jest w tabeli:
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.
tak, wyjście końcowa wynosi 2,0 - zgodnie z oczekiwaniami.
(1) Złożoność Wskazówka:
Tutaj, O(n)
zakłada O(1)
funkcji skrótu. Nie zawsze tak jest. Jeśli przyjmiemy funkcję mieszania O(1)
, możemy również założyć, że sortowanie za pomocą radix-sort to O(n)
i przy użyciu przetwarzania końcowego z O(n)
[podobnego do sugerowanego przez @SteveJessop w jego odpowiedzi], możemy również uzyskać O(n)
z sortowaniem- oparty algorytm.
Wybieram to jako właściwą odpowiedź, ponieważ chociaż odpowiedź @amit była elegancka, zakłada się, że mamy dwa razy większą przestrzeń i funkcję skrótu O (1). Gdybym mógł wybrać dwie odpowiedzi, wybrałbym też odpowiedź Steve'a. –
Hej, nadal musisz śledzić oryginalne wskaźniki, więc nadal potrzebujesz dodatkowej przestrzeni :) –
@VictorParmar Przypis nie mówi, że musisz zwrócić indeksy. "Sprawdź, czy ..." brzmi dla mnie, jakby pytał o funkcję boolowską (więc nie trzeba pamiętać indeksów). – sepp2k