个人思路:常规思路,两个数组,一个左乘积一个右乘积,求出每一个元素的左乘积和右乘积,求得时候可以用递归,然后遍历每个元素,把左右相乘(如果发现存在1个以上的0,直接返回全零)
C
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* productExceptSelf(int* nums, int numsSize, int* returnSize) {
//除自身的乘积的的值 等于 左乘积 * 右乘积
int left[numsSize];
int right[numsSize];
//左乘积
left[0] = 1;
for(int i = 1; i < numsSize; i++){
left[i] = left[i-1] * nums[i-1];
}
//右乘积
right[numsSize-1] = 1;
for(int i = numsSize - 2; i >= 0 ; i--){
right[i] = right[i+1] * nums[i+1];
}
int nums_0 = 0;
*returnSize = numsSize;
int * returnNums = (int *)malloc(sizeof(int) * numsSize);
for(int i=0; i < numsSize; i++){
if(nums[i]==0){
nums_0++;
if(nums_0>1){
for(int j=0;j<numsSize;j++){
returnNums[j]=0;
}
break;
}
}
returnNums[i] = left[i] * right[i];
}
return returnNums;
}