剑指Offer——构建乘积数组

Question

给定一个数组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]。不能使用除法。

Solution

  • 不能用除法,那么我们可以考虑构建除去A[i] 的左右两部分的乘积,也就是0 ~ i-1 和 i+1到n-1.

  • 对应相乘就是去掉A[i]项的结果,也就是B[i]的结果

  • 时间复杂度O(n)

Code

class Solution {
public:
    vector<int> multiply(const vector<int>& A) {
    	if (A.size() == 0)
            return vector<int>();
        
        vector<int> res1(A.size() + 1);
        res1[0] = 1;  // 构造开始项
        for (int i = 1; i < A.size(); i++) {
            res1[i] = res1[i - 1] * A[i - 1];
        }
        
        vector<int> res2(A.size() + 1);
        res2[A.size()] = 1;  //构造结束项
        for (int j = A.size() - 1; j >= 1; j--) {
            res2[j] = A[j] * res2[j + 1];
        }
        
        vector<int> res(A.size());
        for (int i = 0; i < A.size(); i++) {
            res[i] = res1[i] * res2[i + 1];
        }
        return res;
    }
};
原文地址:https://www.cnblogs.com/zhonghuasong/p/7099786.html