构建乘积数组
给定一个数组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]。不能使用除法。
- 如果没有不能使用除法的限值 则可以使用公式
- 现在要求不能使用除法,只能用其他方法。一种直观的解法是用连乘n-1个数字得到B[i]。显然这种方法需要O(n^2)的时间构建整个数组B
- 可以把B[i]=A[0]*A[1] * A[] ******* A[i-1] * A[i+1] * * * A[n-1]看做A[0] *A[1] * A[2] * A[i-1] 和 A[i+1] x A[i+2 ] x A[n-2] x A[n-1]两部分的乘积;因此数组B可以用一个矩阵来创建。B[i]为矩阵第i行的所有元素的乘积。
代码
package A数组;
import javax.annotation.PreDestroy;
import java.util.Arrays;
/**
* @Author Zhou jian
* @Date 2020 ${month} 2020/2/16 0016 13:23
给定一个数组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]和B[n-1] = 1)
*/
public class Problem6
{
public static void main(String[] args) {
Problem6 problem6 = new Problem6();
int[] array1 = {1, 2, 3, 4, 5};
System.out.println(Arrays.toString(problem6.multiply(array1))); // double expected[] = {120, 60, 40, 30, 24};
int[] array2 = {1, 2, 0, 4, 5};
System.out.println(Arrays.toString(problem6.multiply(array2))); // double expected[] = {0, 0, 40, 0, 0};
}
public int[] multiply(int[] A) {
int num = A.length;//数组的长度
int[] B = new int[num];
B[0]=1;
for(int i=1;i<num;i++){
// // 第一步每个result[i]都等于于data[0]*data[1]...data[i-1]
// // 当i=n-1时,此时result[n-1]的结果已经计算出来了【A】
B[i]=B[i-1]*A[i-1];
}
// // tmp保存data[n-1]*data[n-2]...data[i+1]的结果
int temp =1;
for(int t =num-2;t>=0;t--){
temp *=A[t+1];
B[t]=B[t]*temp;//B[t]在第一步基础上
}
return B;
}
}