劍指Offer對答如流系列 構建乘積陣列

2022-08-30 01:57:10 字數 770 閱讀 3528

給定乙個陣列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]=a[0]*a[1]*.....*a[n-1]/a[i]表示,使用除法時要特別注意a[i]等於0的情況。

因為每個b[i]都會有重複,其中有著一定的規律性,我們可以嘗試找規律,利用規律來解答這道問題。

b[i]的左半部分(紅色部分)和b[i-1]有關(將b[i]的左半部分乘積看成c[i],有c[i]=c[i-1]*a[i-1]),

b[i]的右半部分(紫色部分)與b[i+1]有關(將b[i]的右半部分乘積看成d[i],有d[i]=d[i+1]*a[i+1]),

我們可以先從0到n-1遍歷,計算每個b[i]的左半部分;

然後定義乙個變數temp代表右半部分的乘積,從n-1到0遍歷,令b[i]*=temp,而每次的temp上次的temp關係即為temp*=a[i+1]。

public int multiply(int a) 

int b=new int[a.length];

b[0]=1;

for(int i=1;i=0;i--)

return b;

}

劍指Offer對答如流系列 醜數

我們把只包含質因子2 3和5的數稱作醜數 ugly number 求按從小到大的順序的第n個醜數。例如6 8都是醜數,但14不是,因為它包含質因子7。習慣上我們把1當做是第乙個醜數。判斷乙個數是不是醜數,最容易想到的方法就是讓這個數不斷除以2,3,5。對於第n個醜數,只要從1開始,依次判斷每個數是不...

劍指Offer對答如流系列 剪繩子

給你一根長度為n繩子,請把繩子剪成m段 m n都是整數,n 1並且m 1 每段的繩子的長度記為k 0 k 1 k m k 0 k 1 k m 可能的最大乘積是多少?例如當繩子的長度是8時,我們把它剪成長度分別為2 3 3的三段,此時得到最大的乘積18。遇到問題,先分析問題,由分析的結果確定所運用的演...

劍指Offer對答如流系列 包含min函式的棧

定義棧的資料結構,請在該型別中實現乙個能夠得到棧的最小元素的min函式。在該棧中,呼叫min push及pop的時間複雜度都是o 1 push 和 pop均容易實現。主要就是min函式的定義,如果要通過操作push和pop操作獲取最小元素時間複雜度為o 1 基本上是不可能的。如果我們另外定義乙個成員...