構建乘積數組(40)

題目

在這裏插入圖片描述


1、分析

  • 一種方法是分別連乘 n1n-1 個數字,得到 B[i],該方式的時間複雜度爲 O(n2)O(n^2) ,並不是最好的方法。
  • 改用另一種方式,由於 B[i]=A[0]A[1]A[i1]A[i+1]A[n1]B[i]=A[0]*A[1]*···A[i-1]*A[i+1]*···A[n-1],可以將其看成兩部分如下:
  • C[i]=A[0]A[1]A[i1]C[i]=A[0]*A[1]*···A[i-1]D[i]=A[i+1]A[n1]D[i]=A[i+1]*···A[n-1],則B[i]=C[i]D[i]B[i]=C[i]*D[i]
  • 因此可以分別求出 C[i]D[i]C[i]和D[i] ,然後就可以求出對應的 B[i]B[i]
  • 可以先將 C[i]C[i]的所有值算出來存放到容器中,然後再倒過來求得最終的值,這樣該方法的時間複雜度爲 O(n)O(n)

2、代碼

class Solution {
public:
    vector<int> multiply(const vector<int>& A) {
        int n=A.size();
        vector<int> res(n);
        //求 C[i]=A[0]*A[1]*···A[i-1]
        res[0]=1;
        for(int i=1;i<n;++i)
        {
            res[i]=res[i-1]*A[i-1];
        }
        //求 B[i]=C[i]*D[i]
        int temp=1;
        for(int j=n-1;j>=0;--j)
        {
            res[j]*=temp;
            temp*=A[j];
        }
        return res;
    
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章