劍指offer之構建乘積陣列
阿新 • • 發佈:2018-10-31
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;
}