给定长度为 n 的整数数组 nums
,其中 n > 1,返回输出数组 output
,其中 output[i]
等于 nums
中除 nums[i]
之外其余各元素的乘积。
示例:
输入:[1,2,3,4]
输出:[24,12,8,6]
说明: 请不要使用除法,且在 O(n) 时间复杂度内完成此题。
思路:主要还是靠蒙,既然要在O(n)复杂度,再加上是乘积立刻就想到了前缀和,然后蒙一下一下到这跑前缀和,就发现了一个规律
1 ans[i]=sum[i-1]*resum[i+1];
除了第一个和最后一个都满足了,
既然跑了正序前缀和,倒序前缀和,name第一个和最后一个就很简单了
代码:
1 int sum[101011]; 2 int resum[101110]; 3 4 int* productExceptSelf(int* nums, int numsSize, int* returnSize) { 5 for(int i=0;i<=numsSize;i++) 6 sum[i]=1; 7 8 int newArrSize = numsSize+numsSize; 9 int *ans = (int *)malloc(sizeof(int) * newArrSize); 10 sum[0]=nums[0]; 11 12 ans[0]=1; 13 for(int i=1;i<numsSize;i++) 14 sum[i]=sum[i-1]*nums[i],ans[0]*=nums[i]; 15 16 resum[numsSize-1]=nums[numsSize-1]; 17 for(int i=numsSize-2;i>=0;i--) 18 resum[i]=resum[i+1]*nums[i]; 19 20 ans[numsSize-1]=sum[numsSize-2]; 21 for(int i=1;i<numsSize-1;i++) 22 ans[i]=sum[i-1]*resum[i+1]; 23 24 // for(int i=0;i<numsSize;i++) 25 // printf("%d ",ans[i]); 26 *returnSize=numsSize; 27 return ans; 28 }