题目描述
给定一个数组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[0] = A[1] * A[2] * ... * A[n-1],B[n-1] = A[0] * A[1] * ... * A[n-2];)
考察点:发散思维;数组编程。
思路:常规思路是用除法解决,每个乘积少一项,除的时候注意分母为0的情况。题目要求不用乘法,那么根据数字运算规律,
将一行数据分为两部分,以当前的A[i] 为界,两个循环,先计算前半部分,再计算后半部分。乘积就是要求的值。
class Solution {
public:
vector<int> multiply(const vector<int>& A)
{
vector<int> result;
int length = A.size();
if (length == 0)
return result;
result.push_back(1);
for (int i = 0; i <length-1; i++)
{
result.push_back(result.back() * A[i]);//连乘,将结果入数组,
//画图比较好理解,注意下标和循环个数
}
int temp = 1;//后半部分的暂存值
for (int i = length - 1; i >= 0; i--)
{
result[i] = result[i] * temp;//计算结果。
temp = temp * A[i];//往前累乘,更新
}
return result;
}
};