剑指offer之构建乘积数组

1.题目描述

给定一个数组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.问题描述

假设:

//   1  a2 a3 a4
//   a1  1 a3 a4
//   a1 a2  1 a4
//   a1 a2 a3  1

可以看出来,这个数组B分成两部分,分别是左下角和右上角。先计算左下角的连乘,再计算右上角连乘,循环两次就可以的到数组B的值。

3.源代码

vector<int> multiply(const vector<int>& A) {
    int size = A.size();
    if(size == 0)
        return vector<int>();
    vector<int> B(size, 1);
    //   1  a2 a3 a4
    //   a1  1 a3 a4
    //   a1 a2  1 a4
    //   a1 a2 a3  1
    //左下半区,i是下标
    int temp = 1;
    for(int i = 1; i < size; ++i)
    {
        temp *= A[i - 1];
        B[i] = temp;
    }
    //右上半区
    temp = 1;
    for(int i = size - 2; i >= 0; --i)
    {
        temp *= A[i + 1];
        B[i] *= temp;
    }
    return B;
}

猜你喜欢

转载自blog.csdn.net/zqw_yaomin/article/details/83153879
今日推荐