除自身以外数组的乘积

题目信息

给你一个长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 output ,其中 output[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积。

示例:

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

提示:题目数据保证数组之中任意元素的全部前缀元素和后缀(甚至是整个数组)的乘积都在 32 位整数范围内。
说明: 请不要使用除法,且在 O(n) 时间复杂度内完成此题。

解题思路

  1. 暴力破解:所有数字相乘,ans[i] = multiply / nums[i]
  2. 无效操作分析:
    1. 规定不能使用除法
  3. 优化方法:
    1. 从题目出发,计算乘法可分解为需要得到i - 1i + 1处的值,相乘就可以得到结果
    2. 输出数组不被考虑在空间复杂度中,尽可能利用其缓存中间计算结果,减少循环嵌套
  4. 考虑边界
  5. 编码实现

代码

class Solution {
    public int[] productExceptSelf(int[] nums) {
        if (nums == null || nums.length == 0) {
            return new int[0];
        }
        // 将原数组分为三段:[0..i) [i] (i+1..n]
        // 定义输出数组
        int length = nums.length;
        int[] ans = new int[length];
        // 预处理,此时从左到右表示左侧到当前位置的乘积值
        ans[0] = 1;
        for (int i = 1; i < length; i++) {
            ans[i] = ans[i - 1] * nums[i - 1];
        }
        // 计算右侧的乘积值并乘上左侧的预处理值即可得到结果
        int R = 1;
        for (int i = length - 1; i >= 0; i--) {
            ans[i] = ans[i] * R;
            R *= nums[i];
        }
        return ans;
    }
}

题目来源:力扣(LeetCode)
题目链接:https://leetcode-cn.com/problems/product-of-array-except-self

商业转载请联系官方授权,非商业转载请注明出处。

你可能感兴趣的:(除自身以外数组的乘积)