剑指offer:构建乘积数组

来源:互联网 发布:ubuntu 15.04 vim配置 编辑:程序博客网 时间:2024/05/29 17:16

题目描述切换到MarkDown编辑器

给定一个数组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]可以按公式给出的方法,一个个求解。时间复杂度为O(n^2)。
解法二:
将B[i]的求解分为两部分,第一部分先求B[i] = A[0] * A[1] * A[2] *……*A[i-1];第二部分再求B[i] =B[i] * A[i+1] * A[i + 2] * ……*A[n-1] =A[0] * A[1] * A[2] *……*A[i-1]* A[i+1] * A[i + 2] * ……*A[n-1]
先求第一部分,B[0] = 1; B[1] = A[0]; B[2] = A[0] * A[1]; B[3] = A[0] * A[1] * A[2]; B[4] = A[0] * A[1] * A[2] * A[3]……
int temp = 1;
for (int i = 0; i < n; i++)
{
B[i] = temp;
temp = temp * A[i + 1];
}
第二部分同理可求得B[n-1] = B[n-1]; B[n-2] = B[n-2] * A[n-1]; B[n-3] = B[n-3] * A[n-1] * A[n-2];……;B[0] = B[0] * A[1] * A[2] * ……*A[n-1];
c++代码如下:
vector<int> multiply(const vector<int>& A) {
        vector<int> B;
        if (A.empty() || A.size() == 1){
            return B;
        }
        B.push_back(1);
        int length = A.size();
        int leftMult = 1;
        for (int i = 1; i < length; i++){
            leftMult = leftMult * A[i - 1];
            B.push_back(leftMult);
        }
        int rightMult = 1;
        for (int i = length - 2; i >= 0; i--) {
            rightMult = rightMult * A[i+1];
            B[i] = B[i] * rightMult;
        }
        return B;
    
    }
0 0