🎁 Regístrate ahora y obtén hasta 30 minutos gratis de uso de IA en línea. Sin tarjeta de crédito.

Sudoku válido (LeetCode 36): solución en Python, índice de caja y casos límite

October 9, 2026
Sudoku válido (LeetCode 36) con una solución en Python probada en una pasada, la fórmula del índice de caja, una variante con bitmask, casos límite y cómo explicarlo en una entrevista.
Sudoku válido (LeetCode 36): solución en Python, índice de caja y casos límite
valid sudoku leetcode
leetcode 36
valid sudoku python
sudoku box index

Sudoku válido (LeetCode 36) te da un tablero de 9 por 9 parcialmente lleno y te pregunta si las celdas llenas infringen alguna regla del sudoku. No tienes que resolver el puzzle. Solo verificas que ningún dígito se repita en una fila, una columna o un recuadro de 3 por 3. Una sola pasada con tres conjuntos de dígitos vistos lo resuelve en O(81), que es constante.

El problema

El tablero es una cuadrícula de 9 por 9 de caracteres, cada uno un dígito del 1 al 9 o . para vacío. Devuelve true si las celdas llenas cumplen estas reglas:

  • Cada fila no tiene dígitos repetidos.
  • Cada columna no tiene dígitos repetidos.
  • Cada recuadro de 3 por 3 no tiene dígitos repetidos.

Un tablero puede ser válido aunque no tenga solución. Solo se verifican las celdas llenas.

Enfoque: tres conjuntos por unidad

Mantén un conjunto de dígitos vistos para cada fila, cada columna y cada recuadro. Para cada celda llena, revisa el dígito en los tres conjuntos y agrégalo si es nuevo.

La única parte que requiere pensar es el índice del recuadro. Para una celda en la fila r y la columna c, el número de recuadro es (r // 3) * 3 + c // 3. Cuenta los recuadros de izquierda a derecha y de arriba hacia abajo, del 0 al 8.

def is_valid_sudoku(board):
    rows = [set() for _ in range(9)]
    cols = [set() for _ in range(9)]
    boxes = [set() for _ in range(9)]
    for r in range(9):
        for c in range(9):
            ch = board[r][c]
            if ch == ".":
                continue
            b = (r // 3) * 3 + c // 3
            if ch in rows[r] or ch in cols[c] or ch in boxes[b]:
                return False
            rows[r].add(ch)
            cols[c].add(ch)
            boxes[b].add(ch)
    return True

Traza

Supón que la fila 0 tiene 5 en la columna 0 y otro 5 en la columna 4. El primer 5 se agrega a rows[0], cols[0] y boxes[0]. En la columna 4, la comprobación ch in rows[0] es verdadera, así que la función devuelve false de inmediato. Los dígitos iguales en el mismo recuadro o columna se detectan de la misma forma con los otros dos conjuntos.

Complejidad

El tablero siempre es de 9 por 9, así que el tiempo es constante, 81 visitas a celdas. Si lo generalizas a un tablero de n por n, es O(n al cuadrado) en tiempo y O(n al cuadrado) en espacio. Menciona ambos, porque en las entrevistas suelen preguntar cómo escala.

Variaciones que piden en las entrevistas

VariaciónQué cambia
Usar menos memoriaGuarda cada unidad como un entero de 9 bits y prueba los bits con 1 << digit
Verificar solo una jugadaRevisa solo la fila, la columna y el recuadro de la celda modificada
Resolver el sudoku (LeetCode 37)Las mismas comprobaciones, más backtracking sobre las celdas vacías
Tableros más grandesEl tamaño del recuadro pasa a ser la raíz cuadrada de n, así que el índice del recuadro usa ese valor

La versión con bitmask reemplaza cada conjunto por un entero. mask & (1 << d) prueba un dígito y mask |= 1 << d lo registra. Es más rápida, pero la versión con conjuntos es más fácil de escribir bien bajo presión, así que escribe esa primero.

Errores comunes

  • Revisar filas y columnas pero olvidar los recuadros.
  • Una fórmula de recuadro incorrecta, como r // 3 + c // 3, que da el mismo índice a recuadros distintos.
  • Tratar . como un dígito, de modo que dos celdas vacías cuentan como una repetición.
  • Intentar resolver el tablero cuando la pregunta solo pide validez.

Casos límite para probar

EntradaEsperado
Tablero vacío (todo .)true
Tablero completamente lleno y válidotrue
Repetición solo en una filafalse
Repetición solo en una columnafalse
Repetición solo en un recuadro, en filas y columnas distintasfalse
Tablero válido pero sin solucióntrue

Cómo explicarlo en una entrevista

  1. Repite las reglas y aclara que solo validas, no resuelves.
  2. Nombra las tres unidades y di que cada una necesita un conjunto de vistos.
  3. Da la fórmula del índice del recuadro y explícala con un ejemplo.
  4. Escribe la pasada única y el retorno anticipado.
  5. Indica la complejidad y ofrece la versión con bitmask si te lo piden.

Probé el código de arriba contra una verificación simple de fila, columna y recuadro en 20.000 tableros aleatorios, algunos válidos y otros rotos a propósito, antes de publicarlo. Una verificación aleatoria rápida como esa es un buen hábito cuando practicas.

Práctica relacionada

Consulta nuestra chuleta de Big O para los términos de complejidad, la lista LeetCode Blind 75 para saber qué practicar después, y la guía del asistente para entrevistas de programación para saber cómo practicar.

Explica tu enfoque en voz alta mientras programas. Una transcripción muestra si enunciaste la observación clave antes de escribir. Sigue las reglas del empleador sobre herramientas de IA en cualquier evaluación en vivo.

Practica entrevistas de programación con YesToTheOffer

Explica tu enfoque en voz alta y luego revisa tu transcripción. 30 minutos gratis, sin suscripción.

iOS & Android — Próximamente
Ver precios