Carregando
0x40Lição 5 de 13

Acompanhe um intervalo com uma janela deslizante

Aumente e diminua uma janela para resolver problemas de substrings e subarrays em O(n).

20 min Questionário com 5 perguntas 1 exercício de código
Ao final desta lição, você saberá
  • 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 k itens. Some o novo elemento da direita e subtraia o elemento que sai pela esquerda.
  • Tamanho variável: expanda right um passo de cada vez; enquanto a janela quebrar uma regra, encolha-a pela left. 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).

solution.py
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))
Saída
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.

Exercício 1

Maior substring sem repetições

+25 XP

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
main.py
Carregando editor…

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…