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

Posted xym4869

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指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;
    }

以上是关于剑指offer系列——51.构建乘积数组的主要内容,如果未能解决你的问题,请参考以下文章

剑指offer系列25---构建乘积数组

剑指Offer51构建乘积数组

51剑指offer--构建乘积数组

剑指Offer对答如流系列 - 构建乘积数组

剑指offer(二十九)之构建乘积数组

剑指offer-构建乘积数组