剑指offer系列——51.构建乘积数组

Q:给定一个数组\(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[0] = A[1] * A[2] * ... * A[n-1]\)\(B[n-1] = A[0] * A[1] * ... * A[n-2]\);)
A:
解释下代码,设有数组大小为5。
对于第一个for循环
第一步:\(b[0] = 1\);
第二步:\(b[1] = b[0] * a[0] = a[0]\);
第三步:\(b[2] = b[1] * a[1] = a[0] * a[1]\);
第四步:\(b[3] = b[2] * a[2] = a[0] * a[1] * a[2]\);
第五步:\(b[4] = b[3] * a[3] = a[0] * a[1] * a[2] * a[3]\);
然后对于第二个for循环
第一步
\(temp *= a[4] = a[4]\);
\(b[3] = b[3] * temp = a[0] * a[1] * a[2] * a[4]\);
第二步
\(temp *= a[3] = a[4] * a[3]\);
\(b[2] = b[2] * temp = a[0] * a[1] * a[4] * a[3]\);
第三步
\(temp *= a[2] = a[4] * a[3] * a[2]\);
\(b[1] = b[1] * temp = a[0] * a[4] * a[3] * a[2]\);
第四步
\(temp *= a[1] = a[4] * a[3] * a[2] * a[1]\);
\(b[0] = b[0] * temp = a[4] * a[3] * a[2] * a[1]\);
由此可以看出从b[4]到b[0]均已经得到正确计算。

    vector<int> multiply(const vector<int> &A) {
        vector<int> result;
        if (A.empty())
            return result;
        result.push_back(1);
        for (int i = 1; i < A.size(); i++)
            result.push_back(A[i - 1] * result[i - 1]);
        int temp = A[A.size() - 1];
        for (int i = A.size() - 2; i >= 0; i--) {
            result[i] = result[i] * temp;
            temp = temp * A[i];
        }
        return result;
    }
posted @ 2020-02-23 17:09  Shaw_喆宇  阅读(108)  评论(0编辑  收藏  举报