Cómo Elegir Sliding Window o Two Pointers en una Entrevista de Coding
En muchas entrevistas de coding el enunciado habla de arrays o strings y tú dudas entre una ventana deslizante y dos punteros. No son enemigos: la ventana suele ser un caso especial de dos índices. Esta guía te da un chooser rápido para sliding window vs two pointers en una entrevista de coding, con invariantes, plantillas y frases para narrar tu plan.
Clasificación en 10 segundos
Pregúntate:
- ¿La respuesta vive en un segmento contiguo (subarray/substring)? → piensa en sliding window
- ¿El array está ordenado y buscas un par/trío con una condición? → two pointers desde extremos
- ¿Recorres la misma estructura con lectura/escritura in-place (compactar, mover ceros)? → two pointers lento/rápido
- ¿Necesitas el mejor segmento con una restricción (“como máximo K distintos”)? → ventana variable + mapa de frecuencias
Frase útil:
“Si es contiguo con una restricción de validez, uso ventana. Si está ordenado y busco pares, uso dos punteros desde los extremos. Si reescribo in-place, uso slow/fast.”
Cuándo elegir sliding window
Señales típicas:
- “subarray / substring contiguo”
- maximizar/minimizar longitud bajo una condición
- “como máximo K”, “exactamente K”, “sin repetidos”
- la ventana crece por la derecha y se encoge por la izquierda manteniendo una invariante
Plantilla mental:
- Expandir
right - Actualizar contadores
- Mientras la ventana sea inválida, avanzar
left - Actualizar la respuesta (longitud, suma, etc.)
def longest_at_most_k(s, k):
from collections import defaultdict
count = defaultdict(int)
left = best = 0
for right, ch in enumerate(s):
count[ch] += 1
while len(count) > k:
count[s[left]] -= 1
if count[s[left]] == 0:
del count[s[left]]
left += 1
best = max(best, right - left + 1)
return best
Di en voz alta la invariante: “En todo momento la ventana [left, right] cumple la condición.”
Cuándo elegir two pointers (extremos)
Señales:
- array ordenado
- suma de dos números → objetivo
- contenedor con más agua, pares con diferencia, etc.
- puedes argumentar por qué mover
leftorightno pierde el óptimo
def two_sum_sorted(a, target):
i, j = 0, len(a) - 1
while i < j:
s = a[i] + a[j]
if s == target:
return i, j
if s < target:
i += 1
else:
j -= 1
return None
Frase:
“Como está ordenado, si la suma es pequeña muevo el izquierdo; si es grande, el derecho. Así exploro candidatos sin O(n²).”
Two pointers lento/rápido (in-place)
Señales: eliminar duplicados in-place, mover ceros, particionar.
def remove_duplicates_sorted(a):
if not a:
return 0
slow = 0
for fast in range(1, len(a)):
if a[fast] != a[slow]:
slow += 1
a[slow] = a[fast]
return slow + 1
Aquí no hay “ventana válida”; hay un frontier de escritura.
Tabla rápida de decisión
| Señal en el enunciado | Patrón |
|---|---|
| Substring/subarray contiguo + restricción | Sliding window |
| “Exactamente K” contiguo | Window (a menudo atMost(K) − atMost(K−1)) |
| Array ordenado + pares | Two pointers extremos |
| Reescritura in-place | Slow/fast |
| Subsecuencia no contigua | No es window clásico |
| Máximo subarray sin restricción de “validez” tipo Kadane | Kadane / DP, no window genérica |
Errores que consumen el reloj
- Usar ventana cuando el problema no exige contiguidade
- Encoger mal: olvidar borrar claves con conteo 0
- Confundir “como máximo K” con “exactamente K”
- Two pointers en un array no ordenado sin ordenar primero (y sin decir el coste)
- No enunciar la invariante: el entrevistador no ve tu lógica
Frase de recuperación:
“Me equivoqué de patrón: esto es contiguo, cambio a ventana con mapa y mantengo la invariante de validez.”
Complejidad que debes decir
- Ventana con punteros que solo avanzan: O(n) tiempo; O(Σ) espacio del alfabeto/mapa
- Two pointers en array ordenado: O(n) tras O(n log n) si ordenaste
- Slow/fast in-place: O(n) tiempo, O(1) extra
Plan de práctica
| Sesión | Enfoque |
|---|---|
| 1 | Ventana: sin repetidos / ≤ K distintos |
| 2 | Ventana mínima que cubre un requisito |
| 3 | Two sum en array ordenado |
| 4 | Slow/fast: duplicados / mover ceros |
| 5 | Solo clasificar 15 enunciados en 15 minutos |
Nota suave de práctica
Elegir el patrón con calma es una habilidad que se entrena en voz alta y con temporizador. Si quieres un panel lateral para ensayar esa narración bajo presión, Luna Interview está pensado para práctica estructurada y compostura—antes de la entrevista, no como atajo que rompa las reglas durante ella.
Checklist del día
- [ ] ¿Es contiguo? sí → window / no → otro patrón
- [ ] ¿Ordenado + pares? → extremos
- [ ] ¿In-place? → slow/fast
- [ ] Invariante dicha en una frase
- [ ] Complejidad enunciada
- [ ] Dry-run con un ejemplo pequeño
Primero elige el patrón; el código suele ser contabilidad disciplinado después de eso.
Rehearse with an AI interview copilot, then browse commonly reported interview questions.