构建乘积数组(不能使用除法)

题目描述

给定一个数组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]。不能使用除法。
1.题目要求新的数组中不能出现与自己下标i相同的A元素,而其他元素累积相乘。
2.我们通过构建一个前向乘积数组(A[0]*A[1]*…*A[i-1])和后向乘积数组(A[i+1]*A[i+2]*….A[n-1]),然后把两个数组相乘,即可获得所求数组B。
3.实际操作中,我们只需要新建一个结果数组即可,上面的累积乘积可以使用一个变量替代。
4.时间复杂度为O(n),空间复杂度为O(n)。

AC代码如下:

class Solution {
public:
    vector<int> multiply(const vector<int>& A) {
    	vector<int> result(0);
        if(A.size()==0)
            return result;
        
        result=vector<int>(A.size(),1);
        
        int tmp=1;
        
        //前向乘积数组
        for(int i=1;i<A.size();++i)
        {
            tmp*=A[i-1];
            result[i]*=tmp;
        }
        
        tmp=1;
        //后向乘积数组
        for(int i=A.size()-2;i>=0;--i)
        {
            tmp*=A[i+1];
            result[i]*=tmp;
        }
        return result;
    }
};

发表评论

电子邮件地址不会被公开。 必填项已用*标注