🚩传送门:力扣题目

题目

给你一个整数数组 [LC]238. 除自身以外数组的乘积 - 图1 ,返回 数组 [LC]238. 除自身以外数组的乘积 - 图2 ,其中 [LC]238. 除自身以外数组的乘积 - 图3 等于 [LC]238. 除自身以外数组的乘积 - 图4 中除 [LC]238. 除自身以外数组的乘积 - 图5 之外其余各元素的乘积 。

题目数据 保证 数组 [LC]238. 除自身以外数组的乘积 - 图6 之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。

请不要使用除法,且在 [LC]238. 除自身以外数组的乘积 - 图7 时间复杂度内完成此题。

示例 1:

输入: nums = [1,2,3,4] 输出: [24,12,8,6]

示例 2:

输入: nums = [-1,1,0,-3,3] 输出: [0,0,9,0,0]

解题思路:左右乘积列表

image.png
对于给定索引 [LC]238. 除自身以外数组的乘积 - 图9,我们将使用它左边所有数字的乘积乘以右边所有数字的乘积

[LC]238. 除自身以外数组的乘积 - 图10

复杂度分析

时间复杂度:[LC]238. 除自身以外数组的乘积 - 图11,其中 [LC]238. 除自身以外数组的乘积 - 图12 指的是数组[LC]238. 除自身以外数组的乘积 - 图13 的大小。

空间复杂度:[LC]238. 除自身以外数组的乘积 - 图14,输出数组不算进空间复杂度中,因此我们只需要常数的空间存放变量。

官方代码

  1. class Solution {
  2. public int[] productExceptSelf(int[] nums) {
  3. int[] res = new int[nums.length];
  4. int L = 1, R = 1;
  5. // 计算 L 部分的答案
  6. for (int i = 0; i < nums.length; i++) {
  7. res[i] = L;
  8. L *= nums[i];
  9. }
  10. // 计算 R 部分的答案
  11. for (int i = nums.length - 1; i >= 0; i--) {
  12. res[i] *= R;
  13. R *= nums[i];
  14. }
  15. return res;
  16. }
  17. }