LeetCode-除自身以外数组的乘积

1,425 阅读1分钟

算法记录

LeetCode 题目:

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

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

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


说明

一、题目

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

二、分析

  • 如果说这个题不限制使用除法的话直接计算整个数组的乘积,然后除以当前索引的值就可以拿到其余数据的乘积了,但是这一条路直接被抛弃了。
  • 我们不妨来看一下除了当前节点的其余元素乘积之和,是不是就是当前点直接的元素乘积和当前点之后元素乘积的积呢?这样一看当前点之前这不就是前缀和的使用方式么。
  • 所以创建一个前缀积和后缀积就可以解决问题了,给出的元素个数大于 2 个,因此不存在复杂的边界问题。
class Solution {
    public int[] productExceptSelf(int[] nums) {
        int len = nums.length;
        int[] pre = new int[len], last = new int[len], ret = new int[len];
        pre[0] = nums[0];
        last[len - 1] = nums[len - 1];
        for(int i = 1; i < len; i++) {
            pre[i] = pre[i - 1] * nums[i];
        }
        for(int i = len - 2; i >= 0; i--) {
            last[i] = last[i + 1] * nums[i];
        }
        ret[0] = last[1];
        ret[len - 1] = pre[len - 2];
        for(int i = 1; i < len - 1; i++) {
            ret[i] = pre[ i - 1] * last[i + 1];
        }
        return ret;
    }
}

总结

前缀和的变种前缀积的使用。