剑指 Offer 66. 构建乘积数组

题目要求不能用除法,所以只能用乘法,如果每一个B[i]直接乘的话会有很多重复计算,费时
所以可根据题意 可构建一个矩阵,分为上下两个三角区域
下三角区域中,b[n] = b[n-1] * a[n-1]
上三角区域中,b[n] = b[n-+] * a[n+1]
这样递推可以有效地避免重复计算
最后上三角的b[n] 乘上下三角的b[n],就得到结果
在这里插入图片描述

public int[] constructArr(int[] a) {
        if (a.length == 0) return new int[0];

        /** 先建立两个数组bBown 和 bUp 分别来存放上下两个上角的值*/
        int[] bBown = new int[a.length];
        int[] bUp = new int[a.length];

        int[] res = new int[a.length];

        /** 先算出下三角区域的值*/
        bBown[0] = 1;
        for (int i = 1; i <= a.length-1; i++){
            bBown[i] = a[i-1] * bBown[i-1];
        }

        /** 再算出上三角区域的值*/
        bUp[a.length-1] = 1;
        res[a.length-1] = bBown[a.length-1] * bUp[a.length-1];
        for (int j = a.length-2; j >= 0;j--){
            bUp[j] = a[j+1] * bUp[j+1];
            /** 两个三角的值相结合*/
            res[j] = bUp[j] * bBown[j];
        }
        return res;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值