数组 备忘录迭代计算乘积

备忘录迭代:避免递归过程大量重复计算,改用空间存放小问题计算结果

给定一个数组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]。

即去除A[i]的所有元素相乘 ,不能使用除法 

思路:通过动态规划 构建前后2部分的乘积备忘录数组,而后相乘即可

(注意一开始存入基础乘数 1   以及访问的下标调整 )

class Solution {
public:
    vector<int> multiply(const vector<int>& A) {
        
        //可以将最终结果划分为前后2部分相乘 
         vector<int> first;
         vector<int> last;
        first.push_back(1);
        last.push_back(1); 
        int length=A.size();
        for(int i=0;i<length;i++)
        {
            first.push_back(A[i]*first.back());//每次取A[i] *B[i-1]放入B
            last.push_back(A[length-i-1]*last.back());
        }
        vector<int> B;
        for(int i=0;i<length;i++)
        {
            int res=first[i]*last[length-1-i];
            B.push_back(res);
        }
        return B;
        
    }
};

其中 vector中的back()方法获取当前数组最后一个元素 

猜你喜欢

转载自blog.csdn.net/qq_33369979/article/details/87968597