Given an array of n integers where n > 1, nums
, return an array output
such that output[i]
is equal to the product of all the elements ofnums
except nums[i]
.
Solve it without division and in O(n).
For example, given [1,2,3,4]
, return [24,12,8,6]
.
一开始,我是拒绝这道题的。我认为没多大意思,即使生活中遇到题目中的情况,也不会要求说不用除法。
即使是浮点运算的除法,当今的指令集下,速度和以前已经有了质的飞越。但是本着学习算法思想的目的,好好考虑了一下算法过程,认为还是有收货的。
思路:
假设数组有4个数,
a[0],a[1],a[2],a[3],本题就是要我们将下面两个数组相乘。而这两个数组很明显有通式。f(x)=a[x]f(x-1)
{ 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, }
换个思路,更清晰。
从左往右求解的过程中,我们每次都要排除自己a[i]. 以a[i]的分界线,从做左往右看,左边会每次都乘上前一个数。
从右往左看,也是相同道理。
/**
* Return an array of size *returnSize.
* Note: The returned array must be malloced, assume caller calls free().
*/
int* productExceptSelf(int* nums, int numsSize, int* returnSize) {
if(nums==NULL || numsSize <=0)
{
*returnSize =0;
return;
}
int *output = malloc(sizeof(int)* (numsSize));
output[0]=1;
for(int i=1;i<numsSize;i++)
{
output[i] = output[i-1]*nums[i-1];
}
int right=1;
for(int i=numsSize-1;i>=0;i--)
{
output[i]*=right;
right *=nums[i];
}
*returnSize = numsSize;
return output;
}