当前位置: 面试刷题>> 除自身以外数组的乘积(经典算法150题)


### 题目描述 **题目:除自身以外数组的乘积** 给定一个整数数组 `nums`,编写一个函数,该函数返回一个新数组,其中新数组的每个元素是原数组 `nums` 中除了该元素以外所有元素的乘积。 **示例 1**: ``` 输入: nums = [1,2,3,4] 输出: [24,12,8,6] 解释: n = 4 乘积对应为: [2*3*4, 1*3*4, 1*2*4, 1*2*3] = [24,12,8,6] ``` **示例 2**: ``` 输入: nums = [-1,1,0,-3,3] 输出: [0,0,9,0,0] 解释: n = 5 乘积对应为: [-1*1*0*-3*3, -1*0*-3*3, -1*1*0*3, -1*1*-3*3, -1*1*0*-3] = [0,0,9,0,0] 注意:由于数组中存在 0,因此乘积为 0。 ``` ### PHP 示例代码 ```php function productExceptSelf($nums) { $n = count($nums); $leftProduct = array_fill(0, $n, 1); // 左侧乘积数组,初始化为1 $rightProduct = array_fill(0, $n, 1); // 右侧乘积数组,初始化为1 // 计算左侧乘积 for ($i = 1; $i < $n; $i++) { $leftProduct[$i] = $leftProduct[$i - 1] * $nums[$i - 1]; } // 计算右侧乘积(从右向左) for ($i = $n - 2; $i >= 0; $i--) { $rightProduct[$i] = $rightProduct[$i + 1] * $nums[$i + 1]; } // 合并左右乘积得到最终结果 $result = array(); for ($i = 0; $i < $n; $i++) { $result[] = $leftProduct[$i] * $rightProduct[$i]; } return $result; } ``` ### Python 示例代码 ```python def productExceptSelf(nums): n = len(nums) left_product = [1] * n # 左侧乘积数组,初始化为1 right_product = [1] * n # 右侧乘积数组,初始化为1 # 计算左侧乘积 for i in range(1, n): left_product[i] = left_product[i - 1] * nums[i - 1] # 计算右侧乘积(从右向左) for i in range(n - 2, -1, -1): right_product[i] = right_product[i + 1] * nums[i + 1] # 合并左右乘积得到最终结果 return [left * right for left, right in zip(left_product, right_product)] ``` ### JavaScript 示例代码 ```javascript function productExceptSelf(nums) { const n = nums.length; const leftProduct = new Array(n).fill(1); // 左侧乘积数组,初始化为1 const rightProduct = new Array(n).fill(1); // 右侧乘积数组,初始化为1 // 计算左侧乘积 for (let i = 1; i < n; i++) { leftProduct[i] = leftProduct[i - 1] * nums[i - 1]; } // 计算右侧乘积(从右向左) for (let i = n - 2; i >= 0; i--) { rightProduct[i] = rightProduct[i + 1] * nums[i + 1]; } // 合并左右乘积得到最终结果 const result = []; for (let i = 0; i < n; i++) { result.push(leftProduct[i] * rightProduct[i]); } return result; } ``` 这些示例代码均使用了空间换时间的策略,通过分别计算每个元素左侧和右侧的乘积,然后合并得到最终结果。这种方法的时间复杂度为 O(n),空间复杂度也为 O(n)。
推荐面试题