構建乘積陣列

2021-10-11 15:51:06 字數 1891 閱讀 1488

構建乘積陣列

給定乙個陣列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]

方法一:暴力(超時)

public int constructarr(int a) }}

return b;

}

在計算乘積的過程中存在重複計算

方法二:左右乘積陣列

先考慮可以使用除法的情況

left[i] = a[0]...a[i-1]

right[i] = a[i+1]...a[n-1]

所以:b[i] = left[i] * right[i]

在遍歷的過程中,左部分乘積增大,右部分乘積減小

public int constructarr(int a) 

for (int i = 0; i < b.length; i++)

return b;

}

由於存在元素為0,除法會出錯

public int constructarr(int a) 

zerocount++;

} else

}for (int i = 0; i < b.length; i++)

right /= a[i];

b[i] = left * right;

left *= a[i];

}return b;

}

由於不能用除法,可以先將左右乘積的值計算出來,在計算過程中利用前乙個值減少重複計算

left[i]=left[i-1]×a[i-1]

right[i]=right[i+1]×a[i+1]

b[i]=left[i]×right[i]

public int constructarr(int a) 

int b = new int[a.length];

int left = new int[a.length];

int right = new int[a.length];

left[0] = 1;

right[a.length - 1] = 1;

for (int i = 1; i < a.length; i++)

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

for (int i = 0; i < a.length; i++)

return b;

}

方法三:左(或右陣列)

不再使用額外空間

第一次遍歷:用結果陣列b儲存左部分乘積

第二次遍歷:從右往左,b[i]乘上右部分乘積

public int constructarr(int a) 

int b = new int[a.length];

b[0] = 1;

int right = 1;

for (int i = 1; i < a.length; i++)

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

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...