添加链接描述,链接奉上
方法:
- 暴力循环:
- 前缀积×后缀积(分组):
暴力循环:
暴力循换真的是差生法宝,简单好懂,就是不实用,大多数的题目都会超过时间限制(无奈)
思路:
1.写一个除自身的数组乘积函数
2.利用for循环遍历数组
,i
作为循环变量,当遍历到i
时,就求出除i
以外的数组乘积
3.放入返回数组中
代码实现:
static int arr[100000];int mul_self(int* nums, int numsSize,int i)//编写一个除自身的数组乘积函数{int mul=1;for(int j=0;j<numsSize;j++){if(j!=i)mul*=nums[j];}return mul;}
int* productExceptSelf(int* nums, int numsSize, int* returnSize)
{*returnSize=numsSize;int n=0;for(int i=0;i<numsSize;i++)//循环遍历,求出每个除i外数组的乘积{arr[n++]=mul_self(nums,numsSize,i);}return arr;
}
但是此方法局限大,时间超出限制。
前缀积×后缀积(分组):
思路:
根据题目提示,利用前缀积×后缀积即可得到答案,那么问题就演化为求前缀积与后缀积
创建两个数组,一个用来存放前缀积,另一个存放后缀积。
最后循环,将两者相乘,得到除了nums[i]
外的数组乘积
代码实现:
static int ans[100000];int* productExceptSelf(int* nums, int numsSize, int* returnSize)
{int lsum[numsSize];//创建数组int rsum[numsSize];lsum[0]=1;//将边界赋值为1rsum[numsSize-1]=1;for(int i = 1;i < numsSize; i++)//求前缀积{lsum[i]=lsum[i-1]*nums[i-1];}for(int i = numsSize-2;i >= 0;i--)//求后缀积{rsum[i]=rsum[i+1]*nums[i+1];}for(int i = 0;i<numsSize;i++)//求结果数组{ans[i]=lsum[i]*rsum[i];}*returnSize=numsSize;return ans;}
欢迎纠错与讨论哦