【数组】构建乘积数组

题目描述

给定一个数组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
输入
[1,2,3,4,5]
返回值
[120,60,40,30,24]


以示例为例子分析,可以看到B的计算可以拆分为两个步骤,首先计算下三角,然后再计算上三角,两者相乘即可,两个三角的计算可以使用动态规划的思想,例如计算下三角,可以从B[1]开始,后者的值B[i] = B[i-1] * A[i-1];计算上三角的时候从B[3]开始计算,B[i] = B[i+1] * A[i+1]
在这里插入图片描述
实现细节,计算下三角时,可以将下三角的值存在数组B中,计算上三角时,特别注意要使用一个新变量temp来存储上一次累积的上三角的值,一开始想再新开一个数组C来存储上三角的值,然后再和B相乘,这样空间会更大

public int[] multiply(int[] A) {
    
    
	if (A == null) return null;
	int n = A.length - 1;
	int[] B = new int[A.length];
	// 计算下三角
	B[0] = 1;
	for (int i = 1; i <= n; i++) B[i] = B[i - 1] * A[i - 1];
	// 计算上三角
	int temp = 1;
	for (int i = n - 1; i >= 0; i--) {
    
    
	    temp = temp * A[i + 1];
	    B[i] = temp * B[i];
	}
	for (int i = 0; i <= n; i++) {
    
    
	    System.out.print(B[i] + " ");
	}
	return B;
}

猜你喜欢

转载自blog.csdn.net/weixin_43486780/article/details/113795059