[数组基础] 0238. 除自身以外数组的乘积

时间:2024-11-01 16:50:20

文章目录

      • 1. 题目链接
      • 2. 题目大意
      • 3. 示例
      • 4. 解题思路
      • 5. 参考代码

1. 题目链接

0238. 除自身以外数组的乘积



2. 题目大意

描述:给定一个数组 nums。

要求:返回数组 answer,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积。

说明

  • 题目数据保证数组 nums 之中任意元素的全部前缀元素和后缀的乘积都在 32 位整数范围内。
  • 请不要使用除法,且在 O(n) 时间复杂度内解决问题。
  • 进阶:在 O(1) 的额外空间复杂度内完成这个题目。
  • 2 ≤ nums.length ≤ 105。
  • −30 ≤ nums[i] ≤ 30。

3. 示例

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

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


4. 解题思路

  1. 构造一个答案数组 res,长度和数组 nums 长度一致。
  2. 先从左到右遍历一遍 nums 数组,将 nums[i] 左侧的元素乘积累积起来,存储到 res 数组中。
  3. 再从右到左遍历一遍,将 nums[i] 右侧的元素乘积累积起来,再乘以原本 res[i] 的值,即为 nums 中除了 nums[i] 之外的其他所有元素乘积。

5. 参考代码

public class Solution {
    public int[] productExceptSelf(int[] nums) {
        int n = nums.length;
        int[] answer = new int[n];
        
        // 第一步:计算每个元素的前缀乘积
        answer[0] = 1;
        for (int i = 1; i < n; i++) {
            answer[i] = answer[i - 1] * nums[i - 1];
        }
        
        // 第二步:计算后缀乘积并与前缀乘积相乘
        int suffixProduct = 1;
        for (int i = n - 1; i >= 0; i--) {
            answer[i] *= suffixProduct;
            suffixProduct *= nums[i];
        }
        
        return answer;
    }
}