leetcode-Product of Array Except Self-238
Posted 0_summer
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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的主要内容,如果未能解决你的问题,请参考以下文章
javascript Array.of和Array.from