JZ51构建乘积数组

给定数组A,构建一个数组B,其中B[i]等于A中除了i位置元素外的所有元素乘积。不能使用除法。对于长度为1的A,无法构建B。示例输入[1,2,3,4,5],返回[120,60,40,30,24]。解决方案通过矩阵的上下三角形计算,时间复杂度O(n)。" 48244841,4059539,Ubuntu14.04下Qt5.4与OpenCV3.0结合pkg-config配置编译指南,"['Qt开发', 'OpenCV', '图像处理', 'Ubuntu', 'C++']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

给定一个数组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[i]的值可以看做下图的矩阵中每行的乘积。

下三角用连乘可以很容易求得,先算下三角中的连乘,即先计算出B[i]中的一部分,然后将上三角中的数也乘进去。这样一来就只需要两个循环就可以解决这个问题。时间复杂度是O(n);

其实你只需要知道这个是形成一个矩阵,然后每一行是用来计算B[i],每一行的内容则是A[0]到A[n-1]。利用上三角和下三角进行计算。

在这里插入图片描述

因此我们的思路就很清晰了,先算下三角中的连乘,即我们先算出B[i]中的一部分,然后倒过来按上三角中的分布规律,把另一部分也乘进去

代码:

public int[] multiply(int[] A) {
        //1.判空 + A 长度为一?
        if(A == null || A.length==0||A.length==1){
            return null;
        }
        //2.
        int length = A.length;
        int[] B = new int[length];
        B[0] = 1;
        //先算矩阵 1前面部分的
        for (int i = 1; i < length; i++) {
            B[i] = B[i-1]*A[i-1];
        }
        //计算矩阵1 后边部分的,并把前边部分的乘上
        int temp = 1;
        for (int i = length-2;i >= 0;i--){
            temp *= A[i+1];
            B[i] *= temp;
        }

        return B;
    }

参考链接:https://blog.youkuaiyun.com/qq_28081081/article/details/80875917

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值