剑指offer第66题 构建乘积数组



问题描述:

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

示例:

输入: [1,2,3,4,5]
输出: [120,60,40,30,24]

提示:

  • 所有元素乘积之和不会溢出 32 位整数
  • a.length <= 100000


解题思路:

  双层循环的暴力法会超时,就不说了。我们可以列出n行的数组a,将看到一个矩阵,我们需要求的就是每一行的乘积;不过这个矩阵的对角线必须都为1。
  这样就出现了两个三角形,上三角和下三角。我们可以先求下三角的值,然后再将上三角的值乘进来。

在这里插入图片描述



代码实现:

public int[] constructArr2(int[] a) {
    
    
	if(a.length == 0) return new int[0];
    int[] b = new int[a.length];
    b[0] = 1;
    int tmp = 1;
    //本次循环后,b[i]表示a[0]到a[i-1]的乘积,即计算出下三角的乘积
    for(int i = 1; i < a.length; i++) {
    
      
        b[i] = b[i - 1] * a[i - 1];    //只乘到i-1,第i个值是不能乘的。
    }
    //计算出上三角的乘积,
    for(int i = a.length - 2; i >= 0; i--) {
    
     //之所以从length-2开始是因为b[length-1]不能乘以a[length-1]
        tmp *= a[i + 1];   //这里i+1也是因为b[i]不能乘以a[i]
        b[i] *= tmp;
    }
    return b;
}

提交结果:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/HC199854/article/details/109483127