劍指 Offer 66 構建乘積陣列

2021-10-09 06:02:59 字數 1194 閱讀 1452

題目如上。思路如下:

我們假設應該返回的答案為陣列ans。顯而易見ans的陣列長度應等於入參a陣列的長度。

按照題意,對應於ans陣列中的每乙個元素ans[i],其大小應為:

\[ans[i] = a[0] \times a[1] \times  \cdots  \times a[i - 1] \times a[i + 1] \times  \cdots  \times a[length - 1]\]

對於上式,我們可以把\[ans[i]\]分為兩部分相乘,即

\[\left\

ans[i] = c[i] \times d[i]\\

c[i] = a[0] \times a[1] \times  \cdots  \times a[i - 1]\\

d[i] = a[i + 1] \times  \cdots  \times a[length - 1]

\end \right.\]

其中c和d兩個陣列我們可以不用另外開闢空間,剛好有入參a陣列和我們新建的返回陣列ans能滿足運算要求。

易知\[\left\

c[i] = c[i - 1] \times a[i - 1]\\

d[i] = d[i + 1] \times a[i + 1]

\end \right.\]

值得注意得是需要給c[0]賦初始值為1,即ans[0]=1

我們可以首先利用ans的空間將c陣列建立起來,根據上述的公式可得如下**:

for (int i = 1; i < a.length; i++)
同理可以得到d陣列的值,但是為了節省空間,我們用乙個tmp去逆序儲存d[i],逆序的目的是為了方便與c[i] 相乘,得到ans[i]。一樣也需要給tmp賦予初始值1.得到d[i]並求解ans[i]**如下:

for (int i = a.length - 2; i >=0; i--)
完整**如下:

class solution        

int tmp = 1;

for (int i = a.length - 2; i >=0; i--)

return ans;}}

劍指Offer 66 構建乘積陣列

給定乙個陣列a 0,1,2,3,n 1 請構建乙個陣列b 0,1,2,3,n 1 條件為b i a 0 a 1 a 2 a i 1 a i 1 a n 1 限制 不能使用除法 也就是說b i 等於 a 陣列中除a i 以外的其他所有元素之積 思路1 先來舉例分析一下 例如陣列a 元素個數n 5 b ...

劍指offer 66 構建乘積陣列

給定乙個陣列a,構建乙個陣列 b,其中b中的元素b i a 0 xa 1 x a i 1 xa i 1 x a n 1 不能a使用除法。對於這道題,由於不能使用除法,可以把b i a 0 xa 1 x a i 1 xa i 1 x a n 1 看成是a 0 xa 1 x a i 1 和a i 1 x...

劍指 Offer 66 構建乘積陣列

劍指 offer 66.構建乘積陣列 給定乙個陣列 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,2,3,4,5 輸出 120,60,40,30,24 所有元素乘積之和不會溢位 3...