剑指offer-51.构建乘积数组

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zxm1306192988/article/details/81975028

题目描述
给定一个数组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]。不能使用除法。

题解:

如果用双重循环累乘,每次跳过第i 个位置的数,会出现很多重复的累乘,观察下图:

B[i] 的值可以看作下图的矩阵中每行的乘积。
注意到 下三角从上到下,第 i 行是上一行多乘以一个A[i - 1] ; 上三角从下往上 第 j 行是下一行多乘以一个 A[j+1]。
分别先累乘下三角每行的值,然后再累乘上三角每行的值。

import java.util.ArrayList;
public class Solution {
    public int[] multiply(int[] A) {
        if (A == null) {
            return null;
        }
        int[] B = new int[A.length];
        if(A.length==0){
            return B;
        }
        // 计算下三角连乘
        B[0] = 1;
        for (int i = 1; i < A.length; i++) {
            B[i] = B[i - 1] * A[i - 1];// 每一个位置是上一行多乘以A[i - 1]
        }
        // 计算上三角
        int temp = 1;
        for (int j = A.length - 2; j >= 0; j--) {
            temp *= A[j + 1];
            B[j] *= temp;
        }
        return B;
    }
}

猜你喜欢

转载自blog.csdn.net/zxm1306192988/article/details/81975028
今日推荐