码迷,mamicode.com
首页 > 其他好文 > 详细

leetcode-Product of Array Except Self-238

时间:2016-09-03 22:26:04      阅读:166      评论:0      收藏:0      [点我收藏+]

标签:

输入一个数组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

标签:

原文地址:http://www.cnblogs.com/0summer/p/5838005.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!