給定乙個陣列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這裡,其實還可以優化一下就是,可以不使用c這個陣列,這樣就節省了少許空間,**如下: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; }
}
publicover......class
solution
int temp =1;
for(int j=a.length-2; j>=0; j--)
return
b; }
}
構建乘積陣列
給定乙個陣列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...