【剑指offer】构建乘积数组

来源:互联网 发布:风力发电现状 知乎 编辑:程序博客网 时间:2024/06/04 20:17

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

分析:此题一上来就用的2层循环,虽然也能做出来,但是时间复杂度是O(n2),因此想着能不能优化一下算法,减少时间复杂度。参考了别人的思想,自己用程序实现。思想很简单,我们用2个数组a,ba[i]保存原数组第i个元素左边的所有元素之积,b[i]保存原数组第i个元素右边的所有元素之积,然后数组a和数组b的元素对应相乘就得到了新数组,时间复杂度为O(n),思想是不是很简单微笑

程序:

    vector<int> multiply(const vector<int>& A) {        if (A.empty())  return A;        int n = A.size(), i = 1;        vector<int>  b(n, 0), c(n, 0);        b[0] = 1;        c[n - 1] = 1;        while (i < n) {            b[i] = b[i - 1] * A[i - 1];           //求b[i];            c[n - 1 - i] = c[n - i] * A[n - i];   //求c[i];            i++;        }        i = 0;        while (i < n) {            b[i] = b[i] * c[i]; i++;        }        return b;    }

原创粉丝点击