首页 > 代码库 > 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
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。