Parametrami wejściowymi są tablica liczb całkowitych A o raz liczba całkowita K.
Należy obliczyć ilość par liczb uzupełniających się.
Para liczb (i,j) uzupełnia się gdy spełniają one warunek
A[i] + A[j] = KMaksymalna złożoność algorytmu to O(n) - czyli liniowa!
Iteracja po tablicy A wewnątrz drugiej iteracji po tej tablicy odpada więc na starcie :)
Rozwiązaniem problemu jest Dictionary!
W polach "Key" słownika trzymamy wartości z tablicy A, natomiast w odpowiadających im polach "Value" ilość wystąpień tej wartości.
Pierwsza iteracja - budowa słownika!
W kolejnej iteracji obliczamy różnicę między wartością z tablicy A a parametrem K. Jeżeli wynik tej różnicy znajduje się w słowniku to jest to para uzupełniająca się według żądanego schematu, więc zliczamy ilość jej wystąpień.
public int ComplementaryPairsCount(int[] A, int K) { int result = 0; Dictionary<int, int> valuesToCount = new Dictionary<int, int>(); for (int index = 0; index < A.Length; index++) { int key = A[index]; if (valuesToCount.ContainsKey(key)) valuesToCount[key]++; else valuesToCount.Add(key, 1); } for (int index = 0; index < A.Length; index++) { int difference = K - A[index]; if (valuesToCount.ContainsKey(difference))//found complementary pair result += valuesToCount[difference]; } return result; }Co zostało założone, zostało spełnione. Kolejny problem przestał istnieć.
Będziesz miał problem z duplikatami. Dajmy na to, dla zbioru {2,2} wypluje to wynik 2, a moim zdaniem, poprawny wynik to 1.
OdpowiedzUsuńMasz rację, przy założeniu, że duplikaty mają być brane pod uwagę tylko raz należy opracować inny algorytm.
OdpowiedzUsuń