Для целочисленного массива nums вернуть ответ массива, такой, что ответ[i] равен произведению всех элементов nums, кроме nums[i].
Произведение любого префикса или суффикса чисел гарантированно вписывается в 32-битное целое число.
Вы должны написать алгоритм, который работает за время O(n) и не использует операцию деления.
Можете ли вы решить задачу со сложностью дополнительного пространства O(1)? (Выходной массив не считается дополнительным пространством для анализа сложности пространства.)
Чтобы решить эту проблему, нам нужно вычислить произведение всех элементов, кроме текущего, без использования операции деления. Это можно сделать, используя два прохода по массиву:
Мы можем использовать два массива для хранения продуктов префикса и суффикса, а затем умножить их, чтобы получить окончательный результат.
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; iАнализ временной сложности:
Базовое решение работает хорошо, но требует дополнительного места для хранения префиксных и суффиксных продуктов.
Мы можем оптимизировать решение для использования дополнительного пространства O(1), используя выходной массив сначала для хранения продуктов с префиксом, а затем модифицируя его на месте, чтобы включить продукты с суффиксом.
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]
Массив сумм префиксов:
Алгоритмы на месте:
Манипуляции с массивами:
Практикуя такие задачи и стратегии, вы сможете улучшить свои навыки решения проблем и лучше подготовиться к различным задачам кодирования.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3