51、构建乘积数组
一、题目描述
给定一个数组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];)
对于A长度为1的情况,B无意义,故而无法构建,因此该情况不会存在。
二、解题思路
1、最先想到的思路
- 遍历b数组,一个一个的构建
public int[] multiply(int[] A) {
int[] rs=new int[A.length];
for(int i=0;i<rs.length;i++){
rs[i]=1;
}
for(int i=0;i<A.length;i++){
if(i==0){
for(int j=1;j<A.length;j++){
rs[i]=rs[i]*A[j];
}
continue;
}
if(i==A.length-1){
for(int j=0;j<A.length-1;j++){
rs[i]=rs[i]*A[j];
}
continue;
}
for(int j=0;j<i;j++){
rs[i]=rs[i]*A[j];
}
for(int j=i+1;j<A.length;j++){
rs[i]=rs[i]*A[j];
}
}
return rs;
}
2、还有没有好的思路
- 能不能把之前计算过的结果存起来,不过不让用除法,不好办。
- 看了题解,果然有,我真菜。是真菜还是没有花时间去想呢?
- 哎
- 思路就是left[i],以及right[i].
- rs[i]=left[i-1]*right[i+1];
- left[i]=left[i-1]*A[i]
public int[] multiply(int[] A) {
int[] rs=new int[A.length];
int[] left=new int[A.length];
int[] right=new int[A.length];
for(int i=0;i<A.length;i++){
if(i==0){
left[0]=A[0];
}else{
left[i]=A[i]*left[i-1];
}
}
for(int i=A.length-1;i>=0;i--){
if(i==A.length-1){
right[i]=A[i];
}else{
right[i]=A[i]*right[i+1];
}
}
for(int i=1;i<A.length-1;i++){
rs[i]=left[i-1]*right[i+1];
}
rs[0]=right[1];
rs[A.length-1]=left[A.length-2];
return rs;
}