Construção de Arrays e Matrizes de Produto em LeetCode

LeetCode 238: Produto de Array Exceto Próprio

Dado um array nums, retorne um array onde cada elemento é o produto de todos os outros elementos, exceto o próprio. Restrições: sem divisão e complexidade O(n).

Solução: Divide-se o cálculo em duas partes:

  • Produto prefixo (elementos à esquerda)
  • Produto sufixo (elementos à direita)
class Solucao {
public:
    vector<int> produtoExcetoSi(vector<int>& valores) {
        int n = valores.size();
        vector<int> resultado(n, 1);
        int prefixo = 1;
        for (int i = 0; i < n; i++) {
            resultado[i] = prefixo;
            prefixo *= valores[i];
        }
        int sufixo = 1;
        for (int i = n - 1; i >= 0; i--) {
            resultado[i] *= sufixo;
            sufixo *= valores[i];
        }
        return resultado;
    }
};
Passo Operação Array Resultado Sufixo
Início [1,1,1,1] -
Prefixo i=0 a i=3 [1,1,2,6] -
Sufixo i=3: resultado[3]*=1 [1,1,2,6] 4
i=2: resultado[2]*=4 [1,1,8,6] 12
i=1: resultado[1]*=12 [1,12,8,6] 24
i=0: resultado[0]*=24 [24,12,8,6] 24

LeetCode 2906: Construção de Matriz de Produto

Dada uma matriz grid, construa uma matriz onde cada elemento é o produto de todos os outros, exceto si próprio. Restrições: sem divisão e reusltado módulo 12345.

Solução: Expansão bidimensional do conceito de prefixo/sufixo:

  • Primeira passagem: calcula sufixos (inferior/direita)
  • Segunda passagem: multiplica por prefixos (superior/esquerda)
class Solucao {
public:
    vector<vector<int>> construirMatrizProduto(vector<vector<int>>& matriz) {
        const int MOD = 12345;
        int linhas = matriz.size(), colunas = matriz[0].size();
        vector<vector<int>> res(linhas, vector<int>(colunas));
        long sufixo = 1;
        for (int i = linhas - 1; i >= 0; i--) {
            for (int j = colunas - 1; j >= 0; j--) {
                res[i][j] = sufixo;
                sufixo = (sufixo * matriz[i][j]) % MOD;
            }
        }
        long prefixo = 1;
        for (int i = 0; i < linhas; i++) {
            for (int j = 0; j < colunas; j++) {
                res[i][j] = (res[i][j] * prefixo) % MOD;
                prefixo = (prefixo * matriz[i][j]) % MOD;
            }
        }
        return res;
    }
};
Passo Matriz Res Variável
Pós-processamento (sufixo) [[24,12],[4,1]] sufixo=24
Pré-processamento (prefixo) [[24,12],[8,6]] prefixo=24

Técnicas Comuns

  • Núcleo Lógico: Produto = Prefixo × Sufixo
  • Otimização: Uso de variáveis temporárias para O(1) espaço adicional
  • Manipulação de Dados: Ordem inversa para sufixos, ordem direta para prefixos
  • Tratamento de Restrições: Módulo 12345 aplicado durante multiplicações
Problema Complexidade Temporal Complexidade Espacial
LeetCode 238 O(n) O(1)
LeetCode 2906 O(n×m) O(1)

Tags: LeetCode prefixo-sufixo produto-de-array matriz-de-produto Algoritmos

Publicado em 7-16 21:58