剑指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:构建乘积数组的主要内容,如果未能解决你的问题,请参考以下文章