剑指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]。不能使用除法。

 方法一:前后分离相乘

class Solution {
public:
    vector<int> multiply(const vector<int>& A) {
        vector<int> b;
        if(A.size() == 0)
            return b;
        b.resize(A.size());
        int end = A.size() - 1;
        int tmp = 1;
        //第一次前向累乘
        b[0] = 1;
        for(int i =0;i<A.size()-1;i++)
        {
            tmp *= A[i];
            b[i+1] = tmp;
        }
        //第二次后向累乘
        tmp = 1;
        for (int i = end; i > 0; i--)
        {
            tmp *= A[i];
            b[i-1] *= tmp;
        }
        return b;
    }

};

 方法二:除法

class Solution{
public:
     int mult(const vector<int>& A ,int pos)
    {
        int result = 1;
        for(int i = 0; i < pos; ++i)
        {
            result *= A[i];
        }
        for(int i = pos + 1; i < A.size(); ++i)
        {
              result *= A[i];
        }
        return result;
    }
    int decedt(const vector<int>& A,int *pos)
    {
        int count = 0;
        for(int i = 0; i < A.size(); ++i )
        {
            if(A[i] == 0)
            {
                *pos = i;
                count++;
            }
        }
        return count;
    }
    vector<int> multiply(const vector<int>& A) 
    {
        vector<int> res(A.size(),0);
        int pos = -1;
        int zero = decedt(A,&pos);
        if(zero > 1)
        {
            return  res;
        }
        if(zero == 1)
        {
            res[pos] =  mult(A,pos);
            return res;
        }
        int count = mult(A ,-1);
        for(int i = 0; i < A.size(); ++i)
        {
            res[i] = count / A[i];
        }
        return res;
    }
};

猜你喜欢

转载自blog.csdn.net/ox0080/article/details/84102470
今日推荐