Esta lição foi traduzida automaticamente para português e ainda não foi revisada por uma pessoa. Se algo parecer estranho, a versão em inglês é a definitiva.
Imagine uma IA monitorando um feed de vídeo ao vivo em busca de atividades suspeitas. Ele não pode assistir novamente a gravação inteira a cada segundo - ele precisa deslizar uma janela de atenção pelo stream, acompanhando apenas o contexto suficiente. Isso é exatamente o que os padrões de dois ponteiros e de janela deslizante fazem para dados sequenciais.
Ambas as técnicas transformam varreduras O(n²) de força bruta em passagens O(n) elegantes.
Coloque duas referências em uma sequência e mova-as de acordo com uma regra. Existem dois sabores principais.
Comece um ponteiro em cada extremidade e mova-os para dentro. Perfeito para dados classificados.
Problema clássico - Soma de pares: Dada uma matriz ordenada, encontre dois números que somam um destino.
function pairSum(arr, target):
left = 0
right = arr.length - 1
while left < right:
sum = arr[left] + arr[right]
if sum == target: return (left, right)
if sum < target: left += 1
else: right -= 1
return null
Como a matriz está classificada, mover left para a direita aumenta a soma e mover right para a esquerda a diminui - garantindo que nunca perderemos um par válido.
Ambos os ponteiros avançam, mas em velocidades diferentes. Útil para particionamento ou detecção de ciclo.
Exemplo - Remover duplicatas no local: Um ponteiro lento marca a posição de gravação; um ponteiro rápido avança.
function removeDuplicates(arr):
slow = 0
for fast in 1..arr.length - 1:
if arr[fast] != arr[slow]:
slow += 1
arr[slow] = arr[fast]
return slow + 1
Na técnica convergente de dois ponteiros em uma matriz classificada, o que você deve fazer quando a soma atual é menor que o alvo?
Inicie sessão para participar na discussão
Uma janela deslizante mantém uma subsequência contígua de tamanho k (fixo) ou comprimento variável, atualizando agregados de forma incremental em vez de recalcular do zero.
Deslize uma janela com exatamente k elementos na matriz.
Exemplo - Soma máxima de quaisquer k elementos consecutivos:
function maxSubarraySum(arr, k):
windowSum = sum(arr[0..k-1])
best = windowSum
for i in k..arr.length - 1:
windowSum += arr[i] - arr[i - k]
best = max(best, windowSum)
return best
Cada etapa adiciona o novo elemento que entra na janela e subtrai o que sai - O(1) por movimento.
Expanda a janela para incluir mais dados e reduza-a quando uma restrição for violada.
Exemplo - Substring mais longa sem caracteres repetidos:
function longestUnique(s):
seen = {}
left = 0
best = 0
for right in 0..s.length - 1:
if s[right] in seen and seen[s[right]] >= left:
left = seen[s[right]] + 1
seen[s[right]] = right
best = max(best, right - left + 1)
return best
| Padrão | Caso de uso de IA | |--------|------------| | Janela fixa | Detecção de anomalias nas últimas leituras do sensor k | | Janela variável | Encontrar o intervalo de texto mais curto contendo todas as palavras-chave de consulta (mecanismos de pesquisa) | | Ponteiros convergentes | Verificações eficientes do vizinho mais próximo em dimensões de incorporação classificadas | | Ponteiros na mesma direção | Mesclando listas de resultados classificadas de vários modelos de recuperação |
Qual padrão você escolheria para encontrar o menor subarranjo cuja soma excede um determinado valor?
Qual é a complexidade de tempo típica alcançada pela conversão de um loop aninhado de força bruta em uma solução de dois ponteiros ou de janela deslizante?