238. 除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。
题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。
请不要使用除法,且在 O(n) 时间复杂度内完成此题。
首先,这道题看似很简单,貌似只要将数组中所有的数相乘然后除以数组中的元素就行,但是题目中明确规定不能使用除法,所以这种思路肯定不行。因此我们还需要观察题目中的信息可以提供我们别的思路。
恰好题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内这句话
给了我们思路,是否我们可以将数组中的每一个元素的前缀与后缀相乘从而得到结果。
例如:array[2,4,1,3,5];数组长度为numsSize;
1、首先3我们可以先把每个元素的前缀算出来存进一个数组L[];
2、然后我们可以先把每个元素的后缀算出来存进一个数组R[];
3、最后我们分别将这两个数组中的元素相乘在放到另一个数组answer[];
![](https://i-blog.csdnimg.cn/blog_migrate/1a7f0dd3a546bc98ff643c0dad847fe9.png)
int L[1000];
//因为第一个元素前面的前缀没有元素,则可以将L[0]初始唯一,即
L[0]=1;
for(int i=0;i<numsSize-1;i++)
{
L[i]=L[i-1]*array[i-1];//此元素的前缀可以看成是前面一个元素与该元素的前缀之积
}
//对于后缀也同理,只不过是从倒数第二个元素开始,并且将最后一个元素的后缀之积初始为一
int R[1000];
R[numsSize-1]=1;
for(int i=numsSize-2;i>=0;i--)
{
R[i]=R[i+1]*array[i+1];
}
for(int i=0;i<numsSize;i++)
{
answer[i]=L[i]*R[i];
}
最后再返回answer[];即可;