Acompanhe um intervalo com uma janela deslizante
Aumente e diminua uma janela para resolver problemas de substrings e subarrays em O(n).
- Reconhecer problemas de intervalos contíguos.
- Expandir e encolher uma janela mantendo o estado dela atualizado.
- Resolver problemas de maior substring em tempo linear.
Muitos problemas perguntam sobre um subarray ou substring contíguo: a maior substring sem repetições, o menor subarray com soma de pelo menos k, a soma máxima de k itens consecutivos. Testar todos os intervalos é O(n²) ou pior. Uma janela deslizante mantém um intervalo [left, right] e atualiza o estado dele aos poucos conforme as bordas se movem, para que cada elemento entre e saia da janela no máximo uma vez.
Janelas fixas e variáveis
- Tamanho fixo: a janela sempre tem
kitens. Some o novo elemento da direita e subtraia o elemento que sai pela esquerda. - Tamanho variável: expanda
rightum passo de cada vez; enquanto a janela quebrar uma regra, encolha-a pelaleft. Registre a melhor janela válida no caminho.
O estado da janela - uma soma acumulada, ou um dicionário com contagens de caracteres ou com as últimas posições vistas - é o que torna cada passo O(1).
1def max_sum_of_k(nums, k):
2 window = sum(nums[:k])
3 best = window
4 for right in range(k, len(nums)):
5 window += nums[right] - nums[right - k]
6 best = max(best, window)
7 return best
8
9print(max_sum_of_k([2, 1, 5, 1, 3, 2], 3))9
Para “maior substring sem caracteres repetidos”, mantenha um dicionário com o último índice de cada caractere. Quando o caractere novo já foi visto dentro da janela atual, pule left para depois da posição anterior dele. A resposta é o maior right - left + 1 visto. Como left só avança, a varredura inteira é O(n).
Principais conclusões
Janelas resolvem problemas de intervalos contíguos em O(n).
Janelas fixas acrescentam um elemento e removem outro; janelas variáveis expandem e depois encolhem.
Mantenha o estado da janela atualizado aos poucos.
Quiz da aula
5 perguntas · aprovação com 4 acertos · até 50 XP
Ao passar, você conclui a aula e mantém sua sequência. As perguntas erradas voltarão em sessões de revisão.
Pratique: resolva problemas de entrevistas técnicas
Resolva um problema clássico de entrevista em Python e execute-o com casos de teste. Busque a complexidade ideal e depois confira os casos extremos. Os exercícios rodam localmente no navegador.
Maior substring sem repetições
Leia uma string (ela pode estar vazia). Imprima o comprimento da maior substring que não tem caracteres repetidos. Use uma janela deslizante para ter tempo O(n).
- abcabcbb
- Todos iguais
- pwwkew
- Repetição fora da janela
- String vazia
O Python é executado em um ambiente isolado no navegador, com limite de 60 segundos. O runtime é carregado pelo CDN do Pyodide; seu código permanece neste navegador.
Dúvidas sobre esta lição
Travou em algum ponto? Pergunte. Descobriu algo? Compartilhe. Explicar também é uma ótima forma de aprender.
Carregando publicações…