题目描述:
     
    给定一个数组 A[0,1,…,n-1],请构建一个数组 B[0,1,…,n-1],其中B[i] 的值是数组 A 中除了下标 i 以外的元素的积, 
    
    即B[i]=A[0]×A[1]×…×A[i-1]×A[i+1]×…×A[n-1]。不能使用除法。
 

//方法1:暴力遍历求解 

vector<int> multiply(const vector<int>& A) 
{
	vector<int>B;
	int len=A.size();
	for(int i=0;i<len;i++)
	{
		int temp=1;
		for(int j=0;j<len;j++)
		{
			if(i!=j)
				temp*=A[j];	
		}
		B.emplace_back(temp);	
	} 
	return B;
    
}

方法2:矩阵三角区计算

B[i]的值可以看做上图的矩阵中每行的乘积。

下三角用连乘可以很容易求得,先算下三角中的连乘,即先计算出B[i]中的一部分,然后将上三角中的数也乘进去。这样一来就只需要两个循环就可以解决这个问题。时间复杂度是O(n);

其实你只需要知道这个是形成一个矩阵,然后每一行是用来计算B[i],每一行的内容则是A[0]到A[n-1]。利用上三角和下三角进行计算。
 

class Solution {
public:
    vector<int> multiply(const vector<int>& A) {
        vector<int>B(A.size(),1);//声明一个 
        int len=A.size();
        int temp=1;
        for(int i=1;i<len;i++)
        {
            B[i]=B[i-1]*A[i-1];//先计算i之前的乘积,乘积=B[i-1]*A[i-1] ,左下三角 
        } 
        for(int i=len-2;i>=0;i--)
        {
            temp=temp*A[i+1];
            B[i]=B[i]*temp;//先计算i之后的乘积,乘积=B[i]*(temp*A[i+1]) ,右上三角 
        } 
        return B;
    }
};