题目描述:给定一个数组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]的值位对应的矩阵每一行的元素,
此时,将每个B[i]分为上三角和下三角分别求,下三角为一个连乘,上三角可以看作倒过来看,也是连乘
先看下三角:
设sB[0]=1;
sB[1]=A[0];
sB[2]=A[0]A[1];
sB[n-2]=A[0]A[1]A[n-3];
sB[n-1]=A[0]*A[1]...A[n-3]A[n-2];
归纳出i从1到n-1时,sB[i]=A[i-1]sB[i-1],此时的sB[i]并非完全体,需要乘以右边上三角的对应行的值
再看上三角,设temp=1,对应最右下角的1。
所以,完全的B[i]从下到上为:
B[n-1]=tempsB[n-1]
B[n-2]=tempsB[n-2]A[n-1];
...
B[1]=tempsB[1]A[n-1]*A[n-2]...A[2]
B[0]=tempsB[0]A[n-1]A[n-2]....A[2]A[1]
归纳从n-2到0的时候,每一轮搜寻
temp=tempA[j+1]
此时B[j]=sB[j]*temp;
代码如下:
import java.util.ArrayList; public class Solution { public int[] multiply(int[] A) { int n=A.length; int[] B=new int[n]; //设置B[0]=1,对应图中的最左上角数值 B[0]=1; for(int i=1;i<=n-1;i++){ B[i]=B[i-1]*A[i-1]; } int temp=1; for(int j=n-2;j>=0;j--){ temp*=A[j+1]; B[j]*=temp; } return B; } }