来源:http://stackoverflow.com/questions/2680548/given-an-array-of-numbers-return-array-of-products-of-all-other-numbers-no-div
题目:Given an array of numbers,
nums, return an array of numbersproducts, whereproducts[i]is the product of allnums[j], j != i.Input : [1, 2, 3, 4, 5] Output: [(2*3*4*5), (1*3*4*5), (1*2*4*5), (1*2*3*5), (1*2*3*4)] = [120, 60, 40, 30, 24]You must do this in
O(N)without using division.
解法:
An explaination of polygenelubricants method is: The trick is to construct the arrays (in the case for 4 elements)
{ 1, a[0], a[0]*a[1], a[0]*a[1]*a[2], } { a[1]*a[2]*a[3], a[2]*a[3], a[3], 1, }Both of which can be done in O(n) by starting at the left and right edges respectively.
Then multiplying the two arrays element by element gives the required result
My code would look something like this:
int a[N] // This is the input int products_below[N]; p=1; for(int i=0;i<N;++i) { products_below[i]=p; p*=a[i]; } int products_above[N]; p=1; for(int i=N-1;i>=0;--i) { products_above[i]=p; p*=a[i]; } int products[N]; // This is the result for(int i=0;i<N;++i) { products[i]=products_below[i]*products_above[i]; }If you need to be O(1) in space too you can do this (which is less clear IMHO)
int a[N] // This is the input int products[N]; // Get the products below the current index p=1; for(int i=0;i<N;++i) { products[i]=p; p*=a[i]; } // Get the products above the curent index p=1; for(int i=N-1;i>=0;--i) { products[i]*=p; p*=a[i]; }
本文介绍了一种不使用除法的情况下计算乘积数组的方法,即对于输入数组nums,输出一个新数组products,其中products[i]等于nums中除nums[i]外所有元素的乘积。文章提供了一个O(N)时间复杂度的解决方案,并展示了如何通过两次遍历来实现这一目标。
1242

被折叠的 条评论
为什么被折叠?



