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

发布时间 2023-04-22 20:43:31作者: Owlwu

给你一个整数数组 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]
 

提示:

2 <= nums.length <= 105
-30 <= nums[i] <= 30
保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在  32 位 整数范围内
 

进阶:你可以在 O(1) 的额外空间复杂度内完成这个题目吗?( 出于对空间复杂度分析的目的,输出数组不被视为额外空间。)

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/product-of-array-except-self
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


 

似乎好像是之前写过这道题。

由于题目明确要求了不能使用除法,且有可能出现除数为 0 的情况,所以不能简单的用所有元素的乘积除以当前位置元素的值来作为答案。

一个思路就是:某个位置的答案等于其左边所有元素的乘积再乘以右边所有元素的乘积。

因此具体的解题思路就是:先创建一个数组,保存每个下标左边所有元素的乘积。

然后用一个变量存储右边所有变量的乘积并从后往前遍历乘积数组,然后将乘积数组的值与该变量相乘。此时的结果即是当前位置的答案。

class Solution {
    public int[] productExceptSelf(int[] nums) {
        // 第一次遍历保存到当前为止的元素的乘积。
        int[] arr = new int[nums.length];
        arr[0] = 1;
        for (int i = 1; i < nums.length; i ++) {
            arr[i] = nums[i - 1] * arr[i - 1];
        }
        // 从后往前元素的乘积。
        int product = 1;
        for (int i = arr.length - 2; i >= 0; i --) {
            product *= nums[i + 1];
            // 当前位置的答案,等于其左边所有元素的乘积乘以右边所有元素的乘积。
            // 左边所有元素的乘积已经保存在了当前位置,右边所有元素的乘积保存在 product 中。
            arr[i] *= product;
        }
        return arr;
    }
}