构建乘积数组,有没有更好的办法,欢迎讨论
构建乘积数组
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; } }