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

除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。

题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。

不要使用除法,且在O(n) 时间复杂度内完成此题。
示例 1:

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

示例 2:

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

思路分析:

  1. 求出整个数组的乘积,除以当前位置的元素。(pass)

    • 题目中明确不能使用除法。

    • 数组中存在 0 ,就会导致除0错误。

  2. 将整个数组以当前元素为界限,划分为前(\(before\)) 后(\(after\))两部分,当前位置的结果就是\(before \times after\)

public int[] productExceptSelf(int[] nums) {
    int m = nums.length;
    int[] res = new int[m];  // res就是除当前元素的乘积
    // 初始化
    for(int i = 0; i < m; i++){
        res[i] = 1;
    }
    int before = 1; //当前元素的“前缀积”
    int after = 1;  //当前元素的“后缀积”
    for(int i = 0; i < m ; i++){
        res[i] *= before; //此时before是上一个元素的“前缀积”
        before *= nums[i]; //然后再乘以当前的元素
    }
    for(int j = m-1; j >= 0; j--){
        res[j] *= after; //此时before是后一个元素的“后缀积”
        after *= nums[j]; //然后再乘以当前元素
    }
    return res;
}

[!NOTE]

需要注意的点:

  1. 初始化时,元素都为 1 ,而不是 0 ,为 0 的话,全部变成 0 了。
  2. 先收集的结果,在更新的当前的”前缀积“或者”后缀积“。

posted @ 2024-12-17 19:41  Drunker•L  阅读(5)  评论(0编辑  收藏  举报