思路:
题目说不能用除法,且要在O(n)的时间内完成。
考虑联想前缀和和后缀和,我们能不能构建一下前缀乘积和后缀乘积数组,来避免重复运算?
这样对于每一个元素的值,只需要求前缀乘积*后缀乘积就可以了。避免了很多重复运算。相当于先预处理好了。
代码:
class Solution {
const int N = 1e5+10;
public:
vector<int> productExceptSelf(vector<int>& nums) {
int qzcj[N],hzcj[N];
//初始化前缀和后缀数组
qzcj[0]=1;
hzcj[nums.size()+1]=1;
//求前缀乘积
for(int i=1;i<=nums.size();i++)
{
qzcj[i]=qzcj[i-1]*nums[i-1];
}
//求后缀乘积
for(int i=nums.size();i>=1;i--)
{
hzcj[i]=hzcj[i+1]*nums[i-1];
}
for(int i=0;i<nums.size();i++)
{
nums[i]=qzcj[i]*hzcj[i+2];
}
return nums;
}
};