タイトル説明
アレイ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]のときに、2つのステップは、まずAを乗算し、左を見つけ、その後、即ち両者を乗じ、すべてのAを乗算する権利を求めるを求めることは、最終的に対応するB.を与えます 2つのサイクルにより、特に、異なる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;
}
};