《劍指offer》 構建乘積陣列

2021-07-22 07:35:35 字數 930 閱讀 4822

給定乙個陣列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]。不能使用除法。

解法:方法1:暴力解法。

1)假設a=[1,2,3],那麼b[0] = a[1]*a[2]   b[1] = a[0]*a[2]   b[2] = a[0]*a[1]

2)可以發現規律,b[i]就等於a的連乘,除掉a[i]那個數

3)兩個巢狀迴圈,很容易就寫出來,複雜度為o(n^2),內層迴圈用個continue去掉相等的情況就可以了

class solution 

b[i] = temp;

}return b;

}};

方法2:優雅的解法

1)令c[i] = a[0]*a[1]*...*a[i-1],那麼我們可以得到,c[i] = c[i-1] * a[i-1],因為c[i-1] = a[0]*a[1]*...*a[i-3]*ai-2]

2)令d[i] = a[i+1]*...*a[n-1],那麼我們可以得到,d[i] = d[i+1]*a[i+1],因為d[i+1] = a[i+2]*...*a[n-1]

3 ) b[i] = c[i]*d[i]

4 ) 這需要確定1)和2)中迴圈計算c和d時候的迴圈條件,1)中,最小為i-1,所以,i必須從1開始,且小於陣列長度len,取不到;同理2)中,最大為i+1,因此只能i小於len-2,否則陣列將越界,最小i可以取到0下標。

class solution 

for(int i = len - 2; i >= 0; i--)

for(int i = 0; i < len; i++)

return b;

}};

劍指offer 構建乘積陣列

給定乙個陣列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 可以按公式給出的方法,乙個個求解。時間複雜度為o n 2 解法二 將b i 的求解分為兩...

劍指offer 構建乘積陣列

描述題目 給定乙個陣列a 0,1,n 1 請構建乙個陣列b 0,1,n 1 其中乙中的元素b i a 0 a 1 a i 1 a 1 1 a n 1 不能使用除法。class solution vector res n,0 res 0 a 1 res 1 a 0 int multi a 0 a 1 ...

劍指offer 構建乘積陣列

題目描述 給定乙個陣列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 不能使用除法。思路 就是計算這個元素之前所有元素積和之後所有元素積。如果沒計算乙個元素都要將前面和後面所有元素撐起來複雜度是o n2 這裡計算前向乘積...