piątek, 1 czerwca 2012

Zadanie 1 z Codility - rozwiązanie

Kolejny problem rodem z codility zdefiniowany jest następująco.
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] = K
Maksymalna 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ć.

2 komentarze:

  1. 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ń
  2. Masz rację, przy założeniu, że duplikaty mają być brane pod uwagę tylko raz należy opracować inny algorytm.

    OdpowiedzUsuń