[剑指offer]-构建乘积数组

题目描述

给定一个数组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]的时候分为两步,先求左侧所有的A相乘,再求右侧的所有的A相乘,最终将两者相乘即得相应的B。具体通过两次循环,累乘得到不同的B[i],代码如下:

class Solution {
public:
    vector<int> multiply(const vector<int>& A) {
        int len = A.size();
        vector<int> B(len);
        if(len == 0)
            return B;
//总结:第0位和第n-1位为特殊情况,其对应左侧和右侧乘积均当做1,for循环都从第二位和倒数第二位起
        B[0] = 1;//此处的B[0]代表第0位前A[i]的乘积,初始化为1
        for(int i=1;i<len;i++){  //累乘求第1位到第n-1位前面所有A[i]的乘积
            B[i] = B[i-1]*A[i-1];
        }
        int temp = 1; //此处的temp代表最后1位后面A[i]的乘积,对应的是最后一位,所以初始化为1
        for(int i=len-2;i>=0;i--){//累乘求第n-2位到第0位前面所有A[i]的乘积
            temp *=A[i+1];
            B[i] *= temp;
        }
        return B;
    }
};

猜你喜欢

转载自blog.csdn.net/yuemingyang7010/article/details/92365123