🎁 Cadastre-se agora e ganhe até 30 minutos grátis de uso de IA online. Sem cartão de crédito.

Sudoku Válido (LeetCode 36): Solução em Python, Índice de Caixa e Casos Extremos

October 9, 2026
Sudoku Válido (LeetCode 36) com uma solução testada em Python de uma passada, a fórmula do índice de caixa, uma variante com bitmask, casos extremos e como explicá-la em uma entrevista.
Sudoku Válido (LeetCode 36): Solução em Python, Índice de Caixa e Casos Extremos
valid sudoku leetcode
leetcode 36
valid sudoku python
sudoku box index

Valid Sudoku (LeetCode 36) te dá um tabuleiro 9 por 9 parcialmente preenchido e pergunta se as células preenchidas violam alguma regra do sudoku. Você não precisa resolver o quebra-cabeça. Você só verifica que nenhum dígito se repete em uma linha, uma coluna ou um bloco 3 por 3. Uma passada com três conjuntos de dígitos vistos resolve em O(81), que é constante.

O problema

O tabuleiro é uma grade 9 por 9 de caracteres, cada um um dígito de 1 a 9 ou . para vazio. Retorne true se as células preenchidas seguirem estas regras:

  • Cada linha não tem dígito repetido.
  • Cada coluna não tem dígito repetido.
  • Cada bloco 3 por 3 não tem dígito repetido.

Um tabuleiro pode ser válido mesmo sem ter solução. Só as células preenchidas são verificadas.

Abordagem: três conjuntos por unidade

Mantenha um conjunto de dígitos vistos para cada linha, cada coluna e cada bloco. Para cada célula preenchida, verifique o dígito nos três conjuntos e adicione-o se for novo.

A única parte que exige atenção é o índice do bloco. Para uma célula na linha r e coluna c, o número do bloco é (r // 3) * 3 + c // 3. Ele conta os blocos da esquerda para a direita, de cima para baixo, de 0 a 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

Traço

Suponha que a linha 0 tenha 5 na coluna 0 e outro 5 na coluna 4. O primeiro 5 é adicionado a rows[0], cols[0] e boxes[0]. Na coluna 4, a verificação ch in rows[0] é verdadeira, então a função retorna false imediatamente. Dígitos iguais no mesmo bloco ou coluna são pegos pelos outros dois conjuntos da mesma forma.

Complexidade

O tabuleiro é sempre 9 por 9, então o tempo é constante, 81 visitas a células. Se você generalizar para um tabuleiro n por n, é O(n ao quadrado) de tempo e O(n ao quadrado) de espaço. Diga os dois, já que os entrevistadores costumam perguntar como isso escala.

Variações que os entrevistadores pedem

VariaçãoO que muda
Usar menos memóriaArmazenar cada unidade como um inteiro de 9 bits e testar bits com 1 << digit
Verificar apenas uma jogadaVerificar só a linha, a coluna e o bloco da célula alterada
Resolver o sudoku (LeetCode 37)As mesmas verificações, mais backtracking sobre as células vazias
Tabuleiros maioresO tamanho do bloco vira a raiz quadrada de n, então o índice do bloco usa isso

A versão com bitmask substitui cada conjunto por um inteiro. mask & (1 << d) testa um dígito e mask |= 1 << d o registra. É mais rápida, mas a versão com conjuntos é mais fácil de acertar sob pressão de tempo, então escreva essa primeiro.

Erros comuns

  • Verificar linhas e colunas, mas esquecer os blocos.
  • Uma fórmula de bloco errada, como r // 3 + c // 3, que dá o mesmo índice para blocos diferentes.
  • Tratar . como um dígito, fazendo duas células vazias contarem como repetição.
  • Tentar resolver o tabuleiro quando a questão só pede a validade.

Casos extremos para testar

EntradaEsperado
Tabuleiro vazio (tudo .)true
Tabuleiro totalmente preenchido e válidotrue
Repetição só em uma linhafalse
Repetição só em uma colunafalse
Repetição só em um bloco, em linhas e colunas diferentesfalse
Tabuleiro válido, mas sem soluçãotrue

Como explicar em uma entrevista

  1. Reafirme as regras e diga que você só valida, não resolve.
  2. Nomeie as três unidades e diga que cada uma precisa de um conjunto de vistos.
  3. Dê a fórmula do índice do bloco e explique com um exemplo.
  4. Escreva a passada única e o retorno antecipado.
  5. Declare a complexidade e ofereça a versão com bitmask se pedirem.

Testei o código acima contra uma verificação simples de linha, coluna e bloco em 20.000 tabuleiros aleatórios, alguns válidos e outros deliberadamente quebrados, antes de publicar. Uma verificação aleatória rápida como essa é um bom hábito na hora de praticar.

Prática relacionada

Veja nosso Big O cheat sheet para os termos de complexidade, a lista LeetCode Blind 75 para o que praticar em seguida, e o guia do assistente de entrevista de programação para saber como praticar.

Fale sobre sua abordagem em voz alta enquanto programa. Uma transcrição mostra se você declarou a observação principal antes de escrever. Siga as regras da empresa sobre ferramentas de IA em qualquer avaliação ao vivo.

Pratique entrevistas de programação com YesToTheOffer

Explique sua abordagem em voz alta e depois revise sua transcrição. 30 minutos grátis, sem assinatura.

iOS & Android — Em breve
Ver preços