给你一个整数数组?nums
,返回?数组?answer
?,其中?answer[i]
?等于?nums
?中除?nums[i]
?之外其余各元素的乘积?。
题目数据?保证?数组?nums
之中任意元素的全部前缀元素和后缀的乘积都在??32 位?整数范围内。
请?不要使用除法,且在?O(n)
?时间复杂度内完成此题。
解法:一道利用前缀乘和后缀乘思想的题目,先预处理出每个数 左边数的乘积和右边数的乘积,然后遍历每个数,把每个数左边的乘积和右边的乘积相乘即可。
class Solution {
public:
int l[100010],r[100010];//记录坐标i 的前缀乘和后缀乘
vector<int> productExceptSelf(vector<int>& nums) {
vector<int>res;
nums.insert(nums.begin(),1);
l[0]=1;
r[nums.size()]=1;
for(int i=1;i<nums.size();i++)
{
l[i]=l[i-1]*nums[i];
cout<<l[i]<<" ";
}
cout<<endl;
for(int i=nums.size()-1;i>=0;i--)
{
r[i]=r[i+1]*nums[i];
}
for(int i=1;i<nums.size();i++)
{
res.push_back(l[i-1]*r[i+1]);
}
return res;
}
};