文章506
标签266
分类65

算法:构建乘积数组


构建乘积数组

构建乘积数组

给定一个数组A[0,1,…,n-1],请构建一个数组B[0,1,…,n-1],其中B中的元素B[i]=A[0]xA[1]x…xA[i-1]xA[i+1]x…xA[n-1]。

不能使用除法。

(注意:规定B[0] = A[1] x A[2] x … x A[n-1],B[n-1] = A[0] x A[1] x … x A[n-2];)


分析

剑指的思路:

B[i]的值可以看作下图的矩阵中每行的乘积。

下三角用连乘可以很容求得,上三角,从下向上也是连乘。

因此我们的思路就很清晰了,先算下三角中的连乘,即我们先算出B[i]中的一部分,然后倒过来按上三角中的分布规律,把另一部分也乘进去。

img


代码

import java.util.ArrayList;
public class Solution {
    public int[] multiply(int[] arr) {
        if (arr == null) return new int[0];
        int len = arr.length;
        if (len <= 1) return new int[1];

        int[] res = new int[len];
        // 计算下三角
        res[0] = 1;
        for (int i = 1; i < len; ++i) {
            res[i] = res[i - 1] * arr[i - 1];
        }
        // 计算上三角
        int temp = 1;
        for (int i = len - 2; i >= 0; --i) {
            temp *= arr[i + 1];
            res[i] *= temp;
        }
        return res;
    }
}

本文作者:Jasonkay
本文链接:https://jasonkayzk.github.io/1996/07/27/算法-构建乘积数组/
版权声明:本文采用 CC BY-NC-SA 3.0 CN 协议进行许可