Jesteś młodym maniakiem programowania i mieszkasz z 2 innymi najlepszymi przyjaciółmi. Co tydzień jeden z was musi wykonywać wszystkie obowiązki w domu, a ty decydujesz, czyja to kolej, wybierając kij. Ten, kto wybiera najkrótszy kij, przegrywa i wykonuje wszystkie obowiązki.
Ponieważ wszyscy jesteście programistami i uwielbiacie układać puzzle, zmodyfikowaliście „Wybierz najkrótszy kij” w układankę komputerową.
Oto zasady układanki.
- Otrzymasz macierz 2D, w której każda kolumna reprezentuje drążek.
- W każdej kolumnie 1 oznacza część kija, a 0 to puste miejsce
- Przechodząc od góry do dołu w każdej kolumnie, początkowo masz,
0
a jak tylko klikniesz a1
, kij zaczął się, a reszta kolumny zostanie wypełniona1
tylko - Możesz napisać swój program, aby wybrać jedną kolumnę. Rozmiar kija w tej kolumnie określa zwycięzcę / przegranego. Rozmiar kija == liczba 1s w tej kolumnie.
- Jednak program ten może mieć jedynie liniową złożoność w najgorszym przypadku.
Ponieważ wszyscy jesteście programistami, będziecie wiedzieć, czy czyjś program przekracza limit czasu.
Twoim zadaniem jest:
- Napisz program lub funkcję, która akceptuje dane wejściowe w formacie 2D lub w tablicy ciągów.
- Dane wejściowe można pobrać z STDIN / prompt / console lub argumentu funkcji.
- Jeśli czytasz dane wejściowe ze STDIN / zachęty, możesz założyć, że odczyt danych wejściowych i przekształcenie ich w tablicę zajmuje 0 czasu (nawet jeśli kod do tego musi być w odpowiedzi)
- Określ kolumnę z najdłuższym w niej drążkiem.
- Dane wyjściowe mogą być wartością zwracaną przez funkcję lub do STDOUT / console / alert.
- Program / funkcja musi mieć liniową złożoność w najgorszym przypadku,
O(m+n)
gdziem
jest liczba wierszy in
liczba kolumn.
Dane wejściowe mogą mieć jeden z następujących formatów:
Tablica 2D:
[ [0, 0, 0, 0],
[1, 0, 0, 0],
[1, 1, 0, 1],
[1, 1, 1, 1] ]
Tablica ciągów:
[ "0000", "1000", "1101", "1111" ]
Dane wejściowe będą miały następujące właściwości:
- Rozmiar tablicy nie jest znany, załóż prostokąt o dowolnym rozmiarze
- W dowolnej kolumnie od góry do dołu, jeśli zobaczysz 1, to wszystko poniżej będzie jednym
- Dozwolone są drążki z pustymi kolumnami (tj. O długości 0) .
To jest golf golfowy, więc wygrywa najkrótszy kod ! *
Wyjaśnij kod lub podaj wersję bez golfa (aby zweryfikować złożoność czasu) wraz z jednym z dwóch oczekiwanych formatów wejściowych.
AKTUALIZACJA Złożoność czasu liniowego oznacza tutaj O (n + m), gdzie n jest rozmiarem kolumny, a m jest rozmiarem wiersza. (Dla tych, którzy byli niejasni)
AKTUALIZACJA 2 Zdecydowanie można to zrobić w czasie liniowym. A jeśli publikujesz odpowiedź, możesz opóźnić opublikowanie logiki / algorytmu o kilka dni na uczciwą walkę :)
AKTUALIZACJA 3 Przejrzę wszystkie odpowiedzi w ciągu kilku godzin, aby sprawdzić złożoność czasu i program :)
1
na wejściu jest ostatnia komórka, to konieczne jest odczytanie całego wejścia. Nawet jeśli standardowa biblioteka języka fałszuje losowy dostęp do stdin, w scenach buforuje go, a więc zajmuje to czas Omega (n * m).