Wzdłuż ściany zostały ułożone klocki. Następnie na klocki nałożono przezroczystą ściankę. Pojemnik po bokach jest otwarty. Zaczęto nalewać wodę do środka. Ile wody zostanie uwięzione przez klocki? Zakładamy, że każdy klocek jest sześcianem i ma objętość 1 litra.
Na wejściu dana jest lista, która określa ile jest klocków w każdej kolejnej kolumnie. Wszystkie wartości liczbowe są nieujemne. Oto przykładowa ilustracja dla listy {0, 3, 1, 1, 4, 1, 0, 2, 0}.
Przedstawiona konstrukcja może pomieścić 7 litrów. Pierwsza i ostatnia kolumna nie zatrzymuje żadnej wody, ponieważ z jednej strony nie ma nic co by zatrzymało wodę. Pomiędzy kolumną o wysokości 3 i 4 zmieszczą się 4l, ponieważ najwyższa wysokość wody to 3. Z kolei po prawej stronie najwyższej kolumny maksymalny poziom wody to 2.
Podstawowy sposób obliczenia ile wody zostanie w konstrukcji polega na wybraniu każdej kolejnej kolumny i sprawdzeniu co ogranicza je z lewej i prawe strony. Do tego przyda się specjalna funkcja maksimum(), która sprawdzi elementy z określonego zakresu. Przyjmujemy, że wysokość poza ścianką to 0. Oto kod funkcji:
Teraz można przejść do napisania głównej funkcji ileWody(), która dla każdego kolumny klocków wyszukuje ograniczenie na lewo i prawo, a następnie na podstawie uzyskanych ograniczeń i wysokości danej kolumny określa czy zostanie tam nalana jakakolwiek woda. Tutaj należy pamiętać, że ograniczenie minus wysokość danej kolumny może być ujemna. Wtedy należy nie dodawać do łącznej ilości zatrzymanej wody.
Zauważmy, że takie rozwiązanie wymaga przejrzenia całej tablicy za każdym razem, gdy sprawdzana jest kolejna kolumna. Jeśli oznaczymy przez n długość tablicy to dla n elementów jest wykonywane n - 1 porównań elementów - algorytm ma w takim razie złożoność kwadratową O(nn2).
Złożoność algorytmu można poprawić do liniowej O(n) poprzez utworzenie tablic pomocniczych, gdzie na początku algorytmu zostanie zapisane jak wysoka do tej pory została kolumna dla danego indeksu patrząc od lewej oraz patrząc od prawej strony. Następnie przeglądając elementy zamiast wyznaczać wartości można je od razu odczytać i dopisać odpowiednią wartość.
W celu wczytania listy liczb, aby przetestować działanie funkcji wystarczy poniższy fragment kodu: