Leetcode 238. 除自身以外数组的乘积

给定长度为 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 }
View Code
原文地址:https://www.cnblogs.com/tijie/p/9891385.html