Max Consecutive Ones
Otrzymujesz tablicę nums, w której każda wartość to 0 albo 1. Seria to ciąg jedynek znajdujących się obok siebie, bez żadnego 0 pomiędzy nimi. Zwróć długość najdłuższej serii albo 0, jeśli tablica nie zawiera żadnej jedynki.
Funkcja
- numsinteger-array
- tablica zer i jedynek
- Zwracainteger
- długość najdłuższej serii kolejnych jedynek
Ograniczenia
1 ≤ nums.length ≤ 2 × 104- Każde
nums[i]ma wartość0lub1.
Przykłady
- Wejście
- nums = [1, 1, 0, 1, 1, 1, 0, 1]
- Wyjście
- 3
- Wyjaśnienie
- Jedynki tworzą trzy serie: indeksy
0do1(długość 2),3do5(długość 3) oraz sam indeks7(długość 1). Najdłuższa ma długość3.
- Wejście
- nums = [0, 1, 0, 1, 1]
- Wyjście
- 2
- Wyjaśnienie
- Pojedyncza
1na indeksie1przegrywa z parą na indeksach3i4, więc odpowiedzią jest2.
- Wejście
- nums = [0, 0, 0]
- Wyjście
- 0
- Wyjaśnienie
- Nigdzie nie ma 1, więc nie ma serii, a odpowiedź to
0.
Pytanie dodatkowe
Co jeśli możesz zamienić maksymalnie k zer na jedynki? Jak długa może być najdłuższa seria i czy nadal możesz ją znaleźć w jednym przebiegu?
Podpowiedzi
Otwieraj je po kolei. Każda zdradza trochę więcej.
Seria jedynek kończy się w chwili, gdy pojawi się
0. Co musisz pamiętać o wartościach, które już minęły?Liczy się tylko długość serii kończącej się na bieżącym indeksie. 1 wydłuża ją o jeden, a 0 resetuje ją do zera.
Przejdź przez tablicę raz, używając dwóch liczb: długości bieżącej serii i najlepszej dotychczasowej długości. Po każdym 1 zwiększ bieżącą serię i porównaj ją z najlepszą; po każdym 0 zresetuj bieżącą serię.
Rozwiązanie
Seria kończy się w chwili, gdy pojawi się 0, więc dla każdego indeksu wystarczy znać długość serii kończącej się w tym miejscu. Jeden licznik, który zwiększa się przy 1 i zeruje przy 0, pozwala znaleźć najdłuższą serię w jednym przebiegu.
Liczenie w przód od każdego indeksu
Poprawne, ale nie kończy się na największych testach
Intuicja
Wypróbuj każdy indeks jako początek i idź do przodu, dopóki widzisz jedynki; liczba kroków to długość serii rozpoczynającej się w tym miejscu. Najdłuższa seria zaczyna się pod jednym z tych indeksów, więc największa liczba to odpowiedź.
Te przejścia nakładają się na siebie. W tablicy złożonej z n jedynek wykonują około n² / 2 kroków, czyli 2 × 10^8 dla n = 2 × 10^4.
Algorytm
- Ustaw
best = 0. - Dla każdego indeksu
startustawlength = 0. - Gdy
start + lengthznajduje się w tablicy, anums[start + length]ma wartość1, zwiększlengtho 1. - Wybierz większą wartość spośród
bestilength. - Zwróć
best.
def findMaxConsecutiveOnes(nums):
n = len(nums)
best = 0
for start in range(n):
length = 0
while start + length < n and nums[start + length] == 1:
length += 1
best = max(best, length)
return bestJedno przejście z bieżącym licznikiem
Intuicja
Przechowuj w current długość ciągu jedynek kończącego się na indeksie, na którym jesteś. Jedynka wydłuża ten ciąg o jeden, a zero go kończy, więc current spada do 0. Każdy ciąg jest mierzony na swoim ostatnim indeksie, gdzie current jest równy jego pełnej długości, więc największa wartość osiągana przez current jest odpowiedzią.
Dla [1, 1, 0, 1, 1, 1, 0, 1] current przyjmuje wartości 1, 2, 0, 1, 2, 3, 0, 1, a największą z nich jest 3.
Algorytm
- Ustaw
best = 0icurrent = 0. - Dla każdej wartości w
nums: jeśli wynosi1, dodaj 1 docurrenti zachowaj większą z wartościbesticurrent. - Jeśli wynosi
0, ustawcurrent = 0. - Zwróć
best.
def findMaxConsecutiveOnes(nums):
best = 0
current = 0
for x in nums:
if x == 1:
current += 1
best = max(best, current)
else:
# A 0 breaks the run.
current = 0
return best
Pułapki i przypadki brzegowe
- Aktualizowanie
besttylko wtedy, gdy napotkasz0. Seria sięgająca końca, jak w[0, 1, 1], nigdy nie zostanie odnotowana. Aktualizuj wartość po każdym1albo porównaj ją jeszcze raz po pętli. - Niezerowanie
currentpo napotkaniu0. Oddzielne serie sumują się, a[1, 1, 0, 1, 1]zwraca4. - Ustawianie początkowej wartości
bestna1lubnums[0].[0, 0, 0]musi zwrócić0. - W Lua i R, gdzie indeksowanie tablic zaczyna się od 1, ograniczanie przejścia do przodu warunkiem
< nzamiast≤ n. Ostatnia wartość nigdy nie jest odczytywana, więc[0, 1]zwraca0.
Najczęstsze pytania3
Jaka jest złożoność czasowa problemu Max Consecutive Ones?
Rozwiązanie wykonujące jedno przejście działa w czasie O(n), ponieważ odczytuje każdą wartość raz, i wykorzystuje O(1) dodatkowej przestrzeni: jeden licznik bieżącej serii i jeden najlepszej. Ponowne rozpoczynanie liczenia przy każdym indeksie zajmuje O(n²) w przypadku tablicy zawierającej same jedynki.
Dlaczego licznik resetuje się do 0 zamiast do 1?
Licznik przechowuje długość ciągu kończącego się na bieżącym indeksie. Gdy wartość w tym miejscu wynosi 0, nie kończy się tam żaden ciąg jedynek, więc jego długość wynosi 0. Następna jedynka zwiększa tę wartość do 1 — długości nowego ciągu.
Czy problem „Maksymalna liczba kolejnych jedynek” można rozwiązać za pomocą metody przesuwnego okna?
Możesz postrzegać je jako jedno: okno przechowuje bieżący ciąg, jego prawa krawędź przesuwa się przy każdej wartości, a 0 przesuwa lewą krawędź poza nią. Okno nigdy nie zmniejsza się krok po kroku, więc jeden licznik zastępuje dwie krawędzie.
Podobne zadania
Zadania oparte na tych samych pomysłach. Rozwiązanie dwóch lub trzech utrwala schemat.
def findMaxConsecutiveOnes(nums):
# Napisz kod tutajTest #1
Test #2
Test #3
Argument
nums = [1, 1, 0, 1, 1, 1, 0, 1]
Oczekiwany wynik
3