[安全プランを証明] - アレイ建設製品

タイトル説明

アレイ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;
    }
};

おすすめ

転載: blog.csdn.net/yuemingyang7010/article/details/92365123