构建乘积数组

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

【思路】

我们可以看上面的图片,我们可以使用一个和A数组一样大小的b数组,首先计算下三角的乘积,只需要O(n)的时间可以遍历得到一个b[n]的数组,包含下三角的乘积,对角线元素值为1。然后接着对上三角进行乘积,也可以使用O(n)的时间获得其对应的值并于原来的b数组对应相乘,就可以得到答案,总复杂度为2O(n),忽略常数项即为O(n)的时间!效率非常高了!

class Solution {
public:
    vector<int> multiply(const vector<int>& A) {
        int size = A.size();
        vector<int> b(size);
        int res = 1;
        for(int i = 0;i < size; i++){  
            b[i] = res;   // 计算下三角的值b[n-1] = A[0]*...*A[n-2];
            res *= A[i];
        }
        res = 1;
        for(int i = size-1;i >= 0; i--){
            b[i] *= res;  // 计算上半角b[0] = b[0]*...*A[n-1]
            res *= A[i];
        }
        return b;
    }
};
原文地址:https://www.cnblogs.com/zhudingtop/p/11420877.html