剑指Offer(51):构建乘积数组

一、题目描述

给定一个数组A[0,1,…,n-1],请构建一个数组B[0,1,…,n-1],其中B中的元素B[i]=A[0]*A[1]*…*A[i-1]*A[i+1]*…*A[n-1]。不能使用除法。


二、解题思路

观察公式,B[i]公式中没有A[i]项,直观解法是连乘n-1个数字得到B[i],但该方法时间复杂度为O(n^2)。更高效算法可以把B[i]看成A[0]~A[i-1]和A[i+1]~A[n-1]两部分连乘之后的乘积。如下图所示:
B 0 丨 1丨A1丨A2丨 …丨An-2丨An-1
B 1 丨A0丨 1丨A2丨 …丨An-2丨An-1
B 2 丨A0丨A1丨 1丨 …丨An-2丨An-1
…  丨A0丨A1丨 …丨 1丨An-2丨An-1
Bn-2 丨A0丨A1丨 …丨An-3丨 1丨An-1
Bn-1 丨A0丨A1丨 …丨An-3丨An-2丨 1


三、编程实现

public class Solution {
    public int[] multiply(int[] A) {
        int[] B = new int[A.length];
        if (A.length != 0) {
            B[0] = 1;
            // 计算左边A[0]~A[i-1]连乘部分
            for (int i = 1; i < A.length; i++) {
                B[i] = B[i - 1] * A[i - 1];
            }
            // 计算右边A[i+1]~A[n-1]连乘部分赋给temp,再乘上左半部分的连乘积
            int temp = 1;
            for (int j = A.length - 2; j >= 0; j--) {
                temp *= A[j + 1];
                B[j] *= temp;
            }
        }
        return B;
    }
}

猜你喜欢

转载自blog.csdn.net/Fan0628/article/details/89176579