来自力扣的一道题:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
题目描述:
由于题目要求不能使用除法,我们不能采用先算出所有元素的乘积,然后依次除以每个元素来得到所要返回数组的元素的方法。
对于这道题,要算除去某个元素后其余元素的乘积,我们可以先算该元素前边的元素的乘积,然后再算出该元素后边的所有元素的乘积,两者相乘即是除去该元素后的所有元素的乘积,即题目所要求的。
思路如下图所示:
代码:
int* productExceptSelf(int* nums, int numsSize, int* returnSize) {
*returnSize = numsSize;
int* arr = (int*)malloc(sizeof(int) * numsSize);
int left = 1, right = 1; //初始化为1,当所算乘积出去第一个元素或者最后一个元素时
//left、right乘以1
int i = 0;
//算前边元素乘积
for(i = 0; i < numsSize; i++)
{
arr[i] = left; //直接将left存储在arr中,节省空间
left *= nums[i]; //left依次为 1 1*nums[0] 1*nums[0]*nums[1]...
}
//算后边元素乘积
for(i = numsSize - 1; i >= 0; i--) //从最后一个元素开始乘
{
arr[i] *= right; //将left与right相乘
right *= nums[i]; //right为 1 1*nums[numsSize-1]
//1*nums[numsSize-1]*nums[numsSize-2]...
}
return arr;
}