Suma dwóch liczb¶
Opis problemu¶
Rozwiązanie naiwne¶
Funkcja sum_of_two przyjmuje jako argumenty listę tab (lista liczb) oraz liczbę całkowitą k (szukana suma).
Początkowo mamy dwie zagnieżdżone pętle for. Pierwsza pętla iteruje przez wszystkie indeksy i elementy listy tab. Wewnątrz pierwszej pętli mamy drugą pętlę for, która iteruje przez kolejne elementy od indeksu i+1. Dzięki temu unikamy porównywania tej samej liczby ze samą sobą oraz dublowania porównań.
W każdej iteracji wewnętrznej pętli sprawdzamy, czy suma dwóch elementów tablicy (num1 i num2) jest równa szukanej sumie k. Jeśli tak, wypisujemy te dwie liczby i kończymy działanie funkcji za pomocą operacji return.
Jeśli nie znaleziono pary liczb o sumie k w całej liście, wypisujemy \(-1\).
W przykładzie podane są konkretne wartości dla tab i k. Funkcja sum_of_two jest wywoływana z tymi wartościami.
W wyniku wykonania tego kodu, zostaną wypisane liczby \(6\) i \(12\), ponieważ ich suma wynosi \(18\).
Rozwiązanie optymalne¶
Funkcja sum_of_two przyjmuje jako argumenty listę tab (lista liczb) oraz liczbę całkowitą k (szukana suma).
Ustalamy początkowe wartości dla lewego wskaźnika (left) na \(0\) i prawego wskaźnika (right) na długość listy minus 1.
W pętli while sprawdzamy warunek: left < right oraz tab[left] + tab[right] != k. W każdej iteracji pętli sprawdzamy, czy suma tab[left] i tab[right] jest mniejsza od k. Jeśli tak, inkrementujemy lewy wskaźnik (left += 1), aby przesunąć się w prawo i sprawdzić większe wartości. Jeśli suma jest większa od k, dekrementujemy prawy wskaźnik (right -= 1), aby przesunąć się w lewo i sprawdzić mniejsze wartości.
Po wyjściu z pętli, jeśli znaleziono parę liczb o sumie k (left < right), wypisujemy te dwie liczby. Jeśli nie znaleziono takiej pary liczb w całej liście, wypisujemy \(-1\).
W przykładzie podane są konkretne wartości dla tab i k. Funkcja sum_of_two jest wywoływana z tymi wartościami.
W wyniku wykonania tego kodu, zostaną wypisane liczby \(6\) i \(12\), ponieważ ich suma wynosi \(18\).