【前缀和】-- 除自身以外数组的乘积

文章目录

  • 1. 题目
  • 2. 题目解析
  • 3. 代码

1. 题目

在线oj
【前缀和】-- 除自身以外数组的乘积_第1张图片

2. 题目解析

解法一:暴力解法
边枚举位置,边从头开始遍历数组然后求乘积。
时间复杂度0(N ^ 2).

解法二:前缀积

【前缀和】-- 除自身以外数组的乘积_第2张图片
想求 i 位置的最终结果的时候,需要求[0,i-1] 和 [i + 1, n - 1]的乘积。

【预处理前缀积数组和后缀积数组】:

f : 表示前缀积
f[i] : 表示[0,i-1]区间内所有元素的积。
g : 表示后缀积
g[i] :表示 [i + 1, n - 1]区间内所有元素的积。

【 递推公式】:

f[i] = f[i - 1] * nums[i - 1]
g[i] = g[i + 1] * nums[i + 1]

【细节处理】:
f[0] = 1;
g[n - 1] = 1;

3. 代码

class Solution {
    public int[] productExceptSelf(int[] nums) {
        int n = nums.length;
        int[] f = new int[n];
        int[] g = new int[n];
        f[0] = 1;
        g[n - 1] = 1;
        for (int i = 1; i < n; i++) {
            f[i] = f[i - 1] * nums[i - 1];
        }
        for (int i = n - 2; i >= 0 ; i--) {
            g[i] = g[i + 1] * nums[i + 1];
        }
        for (int i = 0; i < n; i++) {
            nums[i] = f[i] * g[i];
        }
        return nums;
    }
}

你可能感兴趣的:(算法,算法,java,开发语言,leetcode)