Wpis z mikrobloga

Kolejne zadanko na miło spędzone popołudnie. Tak jak poprzednie: nieco trikowe i również jak poprzednie zadawane m.in. przez Google na kochanych przez wszystkich whiteboardowych sesjach rekrutacyjnych.

Masz tablicę (powiedzmy xs) n liczb i liczbę k gdzie 1 <= k <= n. Oblicz maksymalną wartość dla kolejno każdego spójnego fragmentu tablicy o rozmiarze k.

np. xs=[10, 5, 2, 7, 8, 7] i k=3 -> [10, 7, 8, 8], ponieważ:

10 = max(10, 5, 2)
7 = max(5, 2, 7)
8 = max(2, 7, 8)
8 = max(7, 8, 7)

Czas O(n) i pamięć O(k). Można modyfikować tablicę i nie trzeba pamiętać całego wyniku, wystarczy wypisywanie tych liczb pojedynczo.

#programowanie #dailycodingproblem
  • 13
@NotABigFan: Utrzymywać pomocniczą "kolejkę" elementów z obserwowanego okienka w taki sposób, że elementy w tej kolejce są w porządku nierosnącym. Tzn. elementem kolejki jest para (indeks, wartość), kolejne elementy są w stronę rosnących indeksów i malejących wartości. Taka kolejka ma maksymalnie k elementów. Może mieć mniej, jeśli obserwowane okienko nie jest złożone z elementów nierosnących, tylko ma ekstrema.

Mając taką pomocniczą strukturę, max z okienka to wartość pierwszego elementu kolejki. Jak
@Demolicjon: Sorry albo nie do końca rozumiem albo to nie amortyzuje się do O(n). Czym się ta Twoja kolejka różni od kopca? Jak chcesz utrzymać niezmiennik kiedy maksymalny element zostanie usunięty z kolejki?
@NotABigFan: Zwizualizuj sobie tę kolejkę jako np. listę wskaźnikową. Max jest z lewej strony. Jak wywalisz maksymalny element, to drugi masz zaraz obok i nie musisz już niczego przestawiać (dzięki niezmiennikowi). O(1) operacja.

Jak pojawia się nowy element, to dla zachowania niezmiennika być może musisz coś wywalić z prawej strony. Wywalenie jednego elementu kosztuje O(1), potem wstawienie O(1). Łącznie masz max. n wstawień i usunięć, więc amortyzuje się do O(n).