首页 > 代码库 > leetcode-Product of Array Except Self-238

leetcode-Product of Array Except Self-238

输入一个数组a[i],求b[i]=a[0]*a[1]*...a[i-1]*a[i+1]....a[n-1]

也就是除了它自己其余元素的乘积组成的数组,要求时间ON,空间O1,并且不能用除法

1.如果能用除法,可以先遍历一遍计算出总的乘积(不考虑溢出),然后在遍历一遍依次用乘积除以当前元素即可

2.不能用除法,又想时间为ON,那么有个思路:空间换时间:

用数组left[i]保存i元素前面的乘积,用right[i]保存i元素右边的乘积,这个处理需要分别从前往后和从后往前遍历一遍,然后再遍历一遍计算b[i]=left[i]*right[i]

总共时间3*N,空间2*N

3.现在只差空间还不够优化了,这么做:

因为函数的返回其实是要一个数组的,那么我们的left[i]和right[i]其实可以直接利用这个数组,其中left[i]不需要先保存,这个直接在从前往后遍历的时候用一个变量保存即可,

现在就差right[i]了,所以我们可以直接用函数返回的数组充当right[i]保存,即:

  1)从后往前遍历把right[i]保存在ans[i]里

  2)从前往后遍历,用cur充当left[i],并计算出最终结果ans[i]=cur*ans[i]

  3)返回ans

时间2*N,空间O1

 1 class Solution { 2 public: 3     vector<int> productExceptSelf(vector<int>& nums) { 4         vector<int> v; 5         int len=nums.size(); 6         if(len==0) return v; 7         v.resize(len); 8         v[len-1]=1; 9         for(int i=len-2;i>=0;i--){10             v[i]=v[i+1]*nums[i+1];11         }12         int cur=1;13         for(int i=0;i<len;i++){14             v[i]*=cur;15             cur*=nums[i];16         }17         return v;18     }19 };

 

leetcode-Product of Array Except Self-238