剑指offer:构建乘积数组

Posted le-le

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指offer:构建乘积数组相关的知识,希望对你有一定的参考价值。

题意描述

给定一个数组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[0] = A[1] * A[2] * ... * A[n-1],B[n-1] = A[0] * A[1] * ... * A[n-2];)

解题思路

通过题意可知:B[i] = A[0]累乘到A[n-1] / A[i],但是题意要求不能使用除法。

技术图片

一、双层循环

将每层的数组分为两部分,【0,i)与(i,len-1】,将两部分进行累乘计算。

但是每层都要重复计算大部分相同的值,唯一区别在于A【i】的不同。

    public int[] multiply(int[] A) {
            int[] B = new int[A.length];
            if (A == null || A.length == 0) return B;
            int len = A.length;
            for (int i = 0; i < len; i++) {
                B[i] = 1;
                for (int j = 0; j < i; j++) {
                    B[i] *= A[j];	//前部分累乘
                }
                for (int j = i + 1; j < len; j++) {
                    B[i] *= A[j];	//后部分累乘
                }
            }
            return B;
        }

二、巧解法

以对象线为分界线,将数组分成两部分:左下角与右上角。分别对下三角和上三角进行求解。

下三角:Bn=Bn-1 * An-1

上三角:从n-2向上计算。

    public int[] multiply(int[] A) {
            int[] B = new int[A.length];
            if(A==null||A.length==0){
                B[0]=1;
                //计算下三角
                for (int i = 1; i <A.length ; i++) {
                    B[i]=B[i-1]*A[i-1];
                }
                int temp=1;	//使用temp记录 A[i+1] * A[len-1] 免去每层计算的时间
                //计算上三角
                for (int i = A.length-2; i>=0; i--) {
                    temp=temp*A[i+1];
                    B[i]=B[i]*temp;
                }
            }
            return B;
        }

以上是关于剑指offer:构建乘积数组的主要内容,如果未能解决你的问题,请参考以下文章

剑指offer五十一之构建乘积数组

剑指 Offer 66. 构建乘积数组

剑指offer系列——51.构建乘积数组

剑指Offer51:构建乘积数组(Java)

剑指 Offer-构建乘积数组

剑指offer-66 构建乘积数组