题目描述

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

题目详情:

20.构建乘积数组

也即是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

是否可以使用动态规划?

 

相关文章:

猜你喜欢
  • 2021-09-04
相关资源
相似解决方案