构建乘积数组

题目

  给定一个数组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[i]=A[0]*A[1]*.....*A[i-1]*A[i+1]*.....*A[n-1]。看成A[0]*A[1]*.....*A[i-1]和A[i+1]*.....A[n-2]*A[n-1]两部分的乘积。

  不妨设定C[i]=A[0]*A[1]*...*A[i-1],D[i]=A[i+1]*...*A[n-2]*A[n-1]。C[i]可以用自上而下的顺序计算出来,即C[i]=C[i-1]*A[i-1]。类似的,D[i]可以用自下而上的顺序计算出来,即D[i]=D[i+1]*A[i+1]。

class Solution {
public:
    vector<int> constructArr(vector<int>& a) {
        if (a.empty()) {
            return {};
        }

        int tmp = 1;
        vector<int> b(a.size(), 0);
        for (int i = 0; i <= a.size() - 1; ++i) {
            b[i] = tmp;//b[2] = a[1]; b[3] = a[1] * a[2];
            tmp *= a[i];
        }

        tmp = 1;
        for (int i = a.size() - 1; i >= 0; --i) {
            b[i] *= tmp;
            tmp *= a[i];
        }
        return b;
    }
};

 

posted on 2019-01-28 12:09  tianzeng  阅读(165)  评论(0编辑  收藏  举报

导航