20.构建乘积数组

 题目描述

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

题目详情:

也即是Bi对应的位置为1即可,相当于A0*A1...An-1的连乘temp,具体计算Bi的时候将上述的连乘temp除于Ai即可;但是题目要求不能使用除法;

解法1:

O(n^2)

两个for循环实现

class Solution {
public:
    vector<int> multiply(const vector<int>& A) 
    {
      int n = A.size();
       vector<int> B(n);
     if (!A.empty())
        {
          
            for (int i = 0; i <= n - 1; i++)
            {    
                int mult = 1;
                for (int j = 0; j <= n - 1; j++)
                {
                    if (j != i)
                        mult *= A[j];
                }
               B[i]= mult;
            }
        }
        return B;    
    }
};

解法:2:

为此分析上述的表格可知:

Bi的计算可以分为两步操作:

1)计算对角线下面的值Bi

2)使用上面的Bi再次计算对角线上面的值

class Solution {
public:
    vector<int> multiply(const vector<int>& A) 
    {
      int length = A.size();
       vector<int> B(length);
        if(length != 0 )
        {
            B[0] = 1;
            //计算下三角也即是对角线的左下边
            for(int i = 1; i < length; i++)
            {
                B[i] = B[i-1] * A[i-1];
            }
            int temp = 1;
            //计算上三角也即是对角线的右上角
            for(int j = length-2; j >= 0; j--)
            {
                temp *= A[j+1];
                B[j] *= temp;
            }
        }
        return B;    
    }
};

参考:【1】https://www.nowcoder.com/questionTerminal/94a4d381a68b47b7a8bed86f2975db46

是否可以使用动态规划?

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

heda3

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值