构建乘积数组(剑指offer第52题)

一、题目描述

    * 给定一个数组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]。
     * 不能使用除法。

二、解题思路

无法使用除法,正常连乘的话时间复杂度为O(n^2),效率非常低。

  考虑到计算每个B[i]时都会有重复,思考B[i]之间的联系,找出规律,提高效率。

图片转自构建乘积数组

  如上图所示,可以发现:

    B[i]的左半部分(红色部分)和B[i-1]有关(将B[i]的左半部分乘积看成C[i],有C[i]=C[i-1]*A[i-1]),

    B[i]的右半部分(紫色部分)与B[i+1]有关(将B[i]的右半部分乘积看成D[i],有D[i]=D[i+1]*A[i+1]),

  因此我们先从0到n-1遍历,计算每个B[i]的左半部分;  然后定义一个变量temp代表右半部分的乘积,从n-1到0遍历,令B[i]*=temp,而每次的temp与上次的temp关系即为temp*=A[i+1]。

三、java代码

public class Solution_52 {
    /**
     * 给定一个数组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]。
     * 不能使用除法。
     */
    public int[] multiply(int[] A) {
    	if(A==null || A.length<2){
    		return null;
    	}
    	int B[] = new int[A.length];
    	//先求下三角型
    	B[0] = 1;
    	for(int i=1;i<A.length;i++){
    		B[i] = B[i-1]*A[i-1];
    	}
    	//计算上三角形顺便利用temp记录值求出最后结果的B数组
    	int temp = 1;
    	for(int i=A.length-2;i>=0;i--){
    		temp *= A[i+1];
    		B[i] *= temp; 
    	}
    	return B;
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 好的,我明白了。对于你的问,“两个数组对应的乘积形成新数组”,我可以回答。 如果给定两个数组a和b,它们的长度相同且都为n,那么可以将它们对应位置的元素相乘得到一个新的数组c,c的长度也为n。具体地,c[i] = a[i] * b[i],其中0 <= i < n。因此,数组c的第i个元素就是数组a和b的第i个元素对应位置相乘的结果。 ### 回答2: 两个数组对应的乘积形成新数组的过程如下: 假设有两个数组A和B,长度分别为n和m。我们要A和B的对应元素相乘的结果,即A[0]*B[0],A[1]*B[1],...,A[n-1]*B[m-1]。 首先,我们创建一个新数组C,长度为n*m,用于存储乘积的结果。然后,我们使用两层循环来遍历数组A和B的所有元素。 外层循环遍历数组A,内层循环遍历数组B。在每一次循环中,我们将A[i]和B[j]相乘,然后将结果存入C数组的对应位置。 具体操作为:对于A中的每一个元素A[i],都将其与B中的每一个元素B[j]相乘,并将结果存入C[i*m+j]的位置。其中,i表示外层循环中A的索引,j表示内层循环中B的索引,i*m+j表示C的索引。 完成两层循环后,C数组中的元素就是A和B对应元素相乘的结果,即第一个元素为A[0]*B[0],第二个元素为A[0]*B[1],...,最后一个元素为A[n-1]*B[m-1]。 最后,我们将数组C返回,即为两个数组对应的乘积形成的新数组。 需要注意的是,两个数组A和B的长度必须一致,否则无法进行对应元素的乘积运算。 ### 回答3: 两个数组对应的乘积形成新数组是通过将两个数组中相同位置的元素相乘得到的。 假设有两个数组A和B,长度分别为n和m。则新数组C的长度为n和m中较小的那个值。 我们可以使用双重循环来遍历数组A和B,将相同位置的元素相乘得到新数组C中的元素。 具体操作如下: 1. 创建一个长度为n和m中较小值的数组C来存储结果。 2. 初始化一个变量i为0,用于表示数组A的索引。 3. 初始化一个变量j为0,用于表示数组B的索引。 4. 使用一个循环,条件为i小于n且j小于m。 5. 在循环内部,将数组A中索引为i的元素与数组B中索引为j的元素相乘,并将结果存入数组C的索引为i的位置。 6. 将i和j都增加1,以便继续遍历下一个位置。 7. 当循环结束后,数组C中存储的就是数组A和B对应位置元素的乘积形成的新数组。 需要注意的是,如果n和m不相等,则只能选择其中较小的长度作为新数组C的长度。 这种方法的时间复杂度为O(min(n, m)),空间复杂度为O(min(n, m)),效率较高。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值