题目描述
给定一个长度为n的数组A,求数组B,B[i] = A[0]A[1]…A[i-1]*A[i+1]…A[n-1]。
要求不能使用除法。
题解
假设:
left[i] = A[0]*…A[i-1]
right[i] = A[i+1]…A[n-1]
所以:
B[i] = left[i] * right[i]
如图:
可知:
left[i+1] = A[0]…A[i-1]A[i]
right[i+1] = A{i+2]…*A[n-1]
于是,
left[i+1] = left[i] * A[i]
right[i] = right[i+1] * A[i+1]
所以,我们可以先把所有的left[i]求出,right[i]求出。
代码
import java.util.ArrayList;
public class Solution {
public int[] multiply(int[] A) {
int len = A.length;
int[] B = new int[len];
B[0] = 1;
for(int i = 1;i<len;i++){
B[i] = B[i-1] * A[i-1];
}
int tmp = 1;
for(int j = len-2;j>=0;j--){
tmp *= A[j+1];
B[j] *=tmp;
}
return B;
}
}
//自己的笨蛋解法
import java.util.ArrayList;
public class Solution {
public int[] multiply(int[] A) {
int len = A.length;
int[] B = new int[len];
for(int i=0;i<len;i++){
if(i==0){
int tmp = 1;
for(int j = 1;j<len;j ++){
tmp *=A[j];
}
B[i] = tmp;
} else if(i==len-1){
int tmp = 1;
for(int j = 0;j<len-1;j ++){
tmp *=A[j];
}
B[i] = tmp;
}else{
int tmp = 1;
for(int j = 0;j<len;j ++){
if(j==i) continue;
tmp *=A[j];
}
B[i] = tmp;
}
}
return B;
}
}