構建乘積陣列

2022-06-26 07:57:13 字數 1374 閱讀 4316

給定乙個陣列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[0] = a[1] * a[2] * ... * a[n-1],b[n-1] = a[0] * a[1] * ... * a[n-2])

對於a長度為1的情況,b無意義,故而無法構建,因此該情況不會存在。

示例1:

輸入:[1,2,3,4,5]

輸出:[120,60,40,30,24]

借用一張圖

可以看出,每乙個b[i]都是除了第i個a[i]之外,所有的a陣列元素之積。

public

class

solution

for(int i = 0; i)

return

b; }

public

int com(int a,int

k)

return

res;}}

但是這樣顯然運算速度是比較慢的,因為你做了一些重複性的計算。

比如,在計算第i個b時,即b[i],你需要可以先計算出a[0]*...*a[i-2]*a[i-1],然後再計算a[i+1]*...*a[n-2]*a[n-1]。那麼在你計算a[0]*...*a[i-2]*a[i-1]時,其實,在前一步求b[i-1]時,你已經計算過a[0]*...*a[i-2]了,故如果將該值儲存起來,那麼在這裡就可以直接使用。這就是動態規劃嘛,是不是?

好,看明白之後,**如下:

public

class

solution

//求上三角

int c = new

int[a.length];

c[a.length-1] = 1;

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

//綜合起來

for(int k =0; k)

return

b; }

}

這裡,其實還可以優化一下就是,可以不使用c這個陣列,這樣就節省了少許空間,**如下:

public

class

solution

int temp =1;

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

return

b; }

}

over......

構建乘積陣列

給定乙個陣列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 n 2 後參考劍指的方法,複雜度降為o n 涉及到這種容易重複計算的要考慮用空間記錄前列的結果 陣列乘...

構建乘積陣列

題目描述 給定乙個陣列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 不能使用除法。思路 類似於動態規劃 用兩個陣列儲存 v1中v1 i 儲存前i 1個數的乘積 v1 0 1 然後從前往後遍歷v i v i 1 a i ...

構建乘積陣列

題目描述 給定乙個陣列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 不能使用除法。構建乘積陣列 author 過路的守望 public class multiplyarray new multiplyarray get...