剑指offer-- 构建乘积数组

博客围绕给定数组 A 构建数组 B 的问题展开。题目要求 B[i] 为 A 中除 A[i] 外元素的乘积且不能用除法。思路是分析 B[i] 间联系,通过两次遍历提高效率。代码实现未给出,收获包括分析元素关系、减少内存使用及注意除数为零问题。

题目

  给定一个数组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]。

代码实现

  

public class Solution {
    public int[] multiply(int[] A) {
        if(A==null||A.length<2) return null;
        int n= A.length;
        int[] B = new int[n];
        B[0] = 1;
        for(int i=1;i<=n-1;i++){
            B[i] = B[i-1]*A[i-1];
        }
        int tmp=1;
        for(int i=n-2;i>=0;i--){
            tmp = tmp*A[i+1];
            B[i] = B[i]*tmp;
        }
        return B;
    }
}

收获

  1.考虑到了数组B中的元素间有关系,要进一步分析。本题就是采用画图的方法,将B看成一个矩阵,就能轻易地看出元素之间的关系了。好好学习。

  2.可以直接从头到尾再从尾到头遍历,不需要创建两个临时数组C[]和D[]。自己写代码时,要尽量设计不用创建太多内存空间。

  3.如果这道题可以用除法的话,记得除数不能为零!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值