Mając tablicę n liczb całkowitych i określoną liczbę X, znajdź wszystkie unikalne pary elementów (a, b), których suma jest równa X.
Oto moje rozwiązanie, jest to O (nLog (n) + n), ale nie jestem pewien, czy jest optymalne, czy nie.
int main(void)
{
int arr [10] = {1,2,3,4,5,6,7,8,9,0};
findpair(arr, 10, 7);
}
void findpair(int arr[], int len, int sum)
{
std::sort(arr, arr+len);
int i = 0;
int j = len -1;
while( i < j){
while((arr[i] + arr[j]) <= sum && i < j)
{
if((arr[i] + arr[j]) == sum)
cout << "(" << arr[i] << "," << arr[j] << ")" << endl;
i++;
}
j--;
while((arr[i] + arr[j]) >= sum && i < j)
{
if((arr[i] + arr[j]) == sum)
cout << "(" << arr[i] << "," << arr[j] << ")" << endl;
j--;
}
}
}
while((arr[i] + arr[j]) <= sum && i < j)
powinny byćwhile( i < J && arr[i] + arr[j] <= sum )
. (podobnie jak w drugiej pętli)Odpowiedzi:
źródło
arr=[1,2,1,2,1,2,1,...]
. Jeśli chodzi o unikalność według wartości, wydaje się, że inna tabela skrótów z kluczem parą wartości załatwi sprawę. Wciąż ładna, kompaktowa, elegancka odpowiedź. +1hash(K - arr[i]) != i
jakoś sprawdza zarówno obecność, jak i brak dopasowania? Spodziewałbym się, że będzie osobna kontrola obecności.Istnieją 3 podejścia do tego rozwiązania:
Niech sumą będzie T, a n będzie rozmiarem tablicy
Podejście 1:
Naiwnym sposobem byłoby sprawdzenie wszystkich kombinacji (n wybierz 2). To wyczerpujące poszukiwanie to O (n 2 ).
Podejście 2:
Lepszym sposobem byłoby posortowanie tablicy. To pobiera O (n log n)
Następnie dla każdego x w tablicy A użyj wyszukiwania binarnego, aby znaleźć Tx. To zajmie O (nlogn).
Zatem ogólne wyszukiwanie to O (n log n)
Podejście 3:
Najlepszym sposobem byłoby wstawienie każdego elementu do tablicy mieszającej (bez sortowania). To przyjmuje O (n) jako stałe wstawienie w czasie.
Wtedy dla każdego x możemy po prostu wyszukać jego uzupełnienie, Tx, czyli O (1).
Ogólnie czas wykonania tego podejścia wynosi O (n).
Możesz polecić więcej tutaj . Dzięki.
źródło
Implementacja w Javie: Korzystanie z algorytmu codaddict (może trochę inny)
Dla input =
{2,45,7,3,5,1,8,9}
i jeśli suma to10
Pary wyjściowe:
Kilka uwag na temat rozwiązania:
źródło
put(k-input[i], input[i])
(codaddicts umieszcza indeks jako wartość, która jest przydatna). To, co napisałeś, można uprościć dofor (i:input){ if (intSet.contains(sum-i) { print(i + "," + (sum-i) ); } else {intSet.add(i)}
Rozwiązanie w java. Możesz dodać wszystkie elementy String do ArrayList z ciągów i zwrócić listę. Tutaj właśnie to drukuję.
źródło
Implementacja Pythona:
Wynik:
źródło
C ++ 11, złożoność czasu wykonania O (n):
źródło
Oto rozwiązanie, które uwzględnia zduplikowane wpisy. Jest napisany w javascript i zakłada, że tablica jest posortowana. Rozwiązanie działa w czasie O (n) i nie używa żadnej dodatkowej pamięci poza zmienną.
Rozwiązałem to podczas rozmowy kwalifikacyjnej dla dużej korporacji. Zabrali to, ale nie ja. Więc tutaj jest dla każdego.
Zacznij od obu stron tablicy i powoli idź do wewnątrz, upewniając się, że policzyłeś duplikaty, jeśli istnieją.
Liczy tylko pary, ale można je przerobić
Cieszyć się!
źródło
if(distI > distK) while(_arr[++i]==curI); else while(_arr[--k]==curK);
Na)
Metodologia: a + b = c, więc zamiast szukać (a, b) szukamy a = c - b
źródło
Implementacja w Javie: Korzystanie z algorytmu codaddict:
Wynik:
Jeśli chcesz zduplikować pary (np .: 80,80), po prostu usuń && (Integer) mapping.get (ka [i])! = I z warunku if i jesteś gotowy do pracy.
źródło
Właśnie uczestniczyłem w tym pytaniu na HackerRank i oto moje rozwiązanie „Cel C” :
Mam nadzieję, że to komuś pomoże.
źródło
jest to implementacja O (n * lg n) przy użyciu implementacji wyszukiwania binarnego wewnątrz pętli.
źródło
W Pythonie
źródło
Niezłe rozwiązanie od Codeaddict. Pozwoliłem sobie zaimplementować jego wersję w Rubim:
Aby umożliwić zduplikowane pary (1,5), (5,1), musimy po prostu usunąć
&& !result[sum-l]
instrukcjęźródło
Oto kod Java dla trzech podejść:
1. Używając Map O (n), można tu również użyć HashSet.
2. Sortuj tablicę, a następnie użyj BinarySearch, aby znaleźć uzupełnienie O (nLog (n))
3. Tradycyjne BruteForce dwie pętle O (n ^ 2)
źródło
Prosty program w Javie dla tablic posiadających unikalne elementy:
źródło
Prosty fragment kodu Java do drukowania poniższych par:
źródło
Inne rozwiązanie w Swift: chodzi o utworzenie skrótu przechowującego wartości (sum - currentValue) i porównanie go z bieżącą wartością pętli. Złożoność wynosi O (n).
źródło
Moje rozwiązanie - Java - bez duplikatów
źródło
Spowoduje to wydrukowanie par i uniknięcie duplikatów przy użyciu manipulacji bitowej.
źródło
Ominąłem manuplację bitów i właśnie porównałem wartości indeksu. Jest to mniej niż wartość iteracji pętli (w tym przypadku i). Nie spowoduje to wydrukowania zduplikowanych par i zduplikowanych elementów tablicy.
źródło
w C #:
źródło
Jednym z rozwiązań może być to, ale nie optymalne (złożoność tego kodu to O (n ^ 2)):
źródło
Prosta wersja kodu w Pythonie, która znajduje sumę par równą zero i może zostać zmodyfikowana, aby znaleźć k:
Złożoność funkcji w czasie wykonywania to również O (n) i Przestrzeń: O (n).
źródło
źródło
rozwiązanie mniejsze niż o (n) będzie =>
źródło
Rozwiązanie w Pythonie wykorzystujące rozumienie list
O (N 2 )
daje również dwie uporządkowane pary - (a, b) i (b, a)
źródło
I am not sure … Thanks for comments
). Możesz oznaczyć pchnięcie w złożoności bliżej O (n²).Mogę to zrobić w O (n). Daj mi znać, kiedy chcesz otrzymać odpowiedź. Zauważ, że wymaga to po prostu jednokrotnego przejścia przez tablicę bez sortowania itp ... Powinienem również wspomnieć, że wykorzystuje przemienność dodawania i nie używa skrótów, ale marnuje pamięć.
using System; using System.Collections.Generic;
/ * Podejście O (n) istnieje przy użyciu tabeli przeglądowej. Podejście polega na przechowywaniu wartości w „koszu”, który można łatwo wyszukać (np. O (1)), jeśli jest kandydatem na odpowiednią sumę.
na przykład,
dla każdego a [k] w tablicy po prostu umieszczamy to w innej tablicy w lokalizacji x - a [k].
Załóżmy, że mamy [0, 1, 5, 3, 6, 9, 8, 7] i x = 9
Tworzymy nową tablicę,
wartość indeksów
WTEDY jedyne wartości, które mają znaczenie, to te, które mają indeks do nowej tabeli.
Powiedzmy, że kiedy osiągniemy 9 lub równe, zobaczymy, czy nasza nowa tablica ma indeks 9 - 9 = 0. Ponieważ wiemy, że wszystkie zawarte w niej wartości dodadzą się do 9. (zauważ, że w tym przypadku jest oczywiste, że jest tylko 1 możliwy, ale może zawierać wiele wartości indeksu, które musimy przechowywać).
W efekcie to, co ostatecznie robimy, to tylko jednokrotne przejście przez tablicę. Ponieważ dodawanie jest przemienne, otrzymamy wszystkie możliwe wyniki.
Na przykład, gdy dojdziemy do 6, otrzymujemy indeks do naszej nowej tabeli jako 9 - 6 = 3. Ponieważ tabela zawiera tę wartość indeksu, znamy wartości.
Zasadniczo polega to na zamianie szybkości na pamięć. * /
źródło
Rozwiązanie JavaScript:
źródło
https://github.com/clockzhong/findSumPairNumber
Zrobiłem to pod kosztem złożoności O (m + n) zarówno dla czasu, jak i przestrzeni pamięci. Podejrzewam, że to najlepszy jak dotąd algorytm.
źródło
int [] arr = {1,2,3,4,5,6,7,8,9,0};
var z = (z a w arr z b w arr, gdzie 10 - a == b wybierz nowy {a, b}).
źródło