题目描述:给定一个数组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=temp
A[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;
    }
}