构建乘积数组,有没有更好的办法,欢迎讨论
构建乘积数组
http://www.nowcoder.com/questionTerminal/94a4d381a68b47b7a8bed86f2975db46
平民解法:使用一个临时变量temp维护上三角的乘积:
import java.util.ArrayList;
public class Solution {
public int[] multiply(int[] A) {
int len = A.length;
int[] B = new int[len];
//B[i]等于除了A[i]以外的数的乘积
int sum = 1;
for(int i=1; i<len; i++){
sum *= A[i];
B[i] = 1;
}
B[0] = sum;
int temp1 = 1; //不能使用除法,只能维护一个从前往后的乘积变量以减少乘积遍历
for(int i=1; i<len; i++){
for(int j=i+1; j<len; j++){
B[i] *= A[j];
}
temp1 *= A[i-1];
B[i] *= temp1;
}
return B;
}
}下面使用两个for循环,分别计算上下三角,降低复杂度:
import java.util.ArrayList;
public class Solution {
public int[] multiply(int[] A) {
int len = A.length;
int[] B = new int[len];
//根据规律,可将对角线为1做乘积,分为上下三角分别计算
//下三角初始化第一行
B[0]=1;
for(int i=1;i<len;i++){
B[i]=B[i-1]*A[i-1]; //首项是B[1]=B[0]*A[0]
}
//上三角初始化最后一行
int temp=1;
for(int i=len-1;i>=0;i--){
B[i]=temp*B[i]; //首项是B[len-1]=B[len-1]*1(最后一个元素按1处理,最后一行的乘积在上面的循环中已经算出)
temp=A[i]*temp;
}
return B;
}
}