Dado um array inteiro nums, retorne uma resposta de array tal que resposta[i] seja igual ao produto de todos os elementos de nums, exceto nums[i].
É garantido que o produto de qualquer prefixo ou sufixo de nums caiba em um número inteiro de 32 bits.
Você deve escrever um algoritmo que seja executado em tempo O(n) e sem usar a operação de divisão.
Você pode resolver o problema de complexidade de espaço extra O(1)? (A matriz de saída não conta como espaço extra para análise de complexidade de espaço.)
Para resolver este problema, precisamos calcular o produto de todos os elementos, exceto o elemento atual, sem usar a operação de divisão. Isso pode ser feito usando duas passagens pelo array:
Podemos usar dois arrays para armazenar os produtos de prefixo e sufixo e depois multiplicá-los para obter o resultado final.
function productExceptSelf(nums: number[]): number[] { const n = nums.length; const prefixProducts = new Array(n).fill(1); const suffixProducts = new Array(n).fill(1); const result = new Array(n).fill(1); // Compute prefix products for (let i = 1; i = 0; i--) { suffixProducts[i] = suffixProducts[i 1] * nums[i 1]; } // Compute the result by multiplying prefix and suffix products for (let i = 0; iAnálise de complexidade de tempo:
A solução básica funciona bem, mas usa espaço extra para armazenar produtos com prefixo e sufixo.
Podemos otimizar a solução para usar espaço extra O(1) usando a matriz de saída para armazenar produtos de prefixo primeiro e depois modificá-la no local para incluir os produtos de sufixo.
function productExceptSelfOptimized(nums: number[]): number[] { const n = nums.length; const result = new Array(n).fill(1); // Compute prefix products in the result array for (let i = 1; i = 0; i--) { result[i] = result[i] * suffixProduct; suffixProduct *= nums[i]; } return result; }
console.log(productExceptSelf([1,2,3,4])); // [24,12,8,6] console.log(productExceptSelf([-1,1,0,-3,3])); // [0,0,9,0,0] console.log(productExceptSelf([2,2,2,2])); // [8,8,8,8] console.log(productExceptSelf([0,0])); // [0,0] console.log(productExceptSelf([5])); // This should not be a valid input as the minimum length is 2 console.log(productExceptSelf([1,2])); // [2, 1] console.log(productExceptSelfOptimized([1,2,3,4])); // [24,12,8,6] console.log(productExceptSelfOptimized([-1,1,0,-3,3])); // [0,0,9,0,0] console.log(productExceptSelfOptimized([2,2,2,2])); // [8,8,8,8] console.log(productExceptSelfOptimized([0,0])); // [0,0] console.log(productExceptSelfOptimized([5])); // This should not be a valid input as the minimum length is 2 console.log(productExceptSelfOptimized([1,2])); // [2, 1]
Matriz de soma de prefixos:
Algoritmos no local:
Manipulação de matriz:
Ao praticar esses problemas e estratégias, você pode melhorar suas habilidades de resolução de problemas e estar mais bem preparado para vários desafios de codificação.
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3