问题:
给定数组,求除本位数字以外所有数字之乘积的新数组
Example: Input: [1,2,3,4] Output: [24,12,8,6] Constraint: It's guaranteed that the product of the elements of any prefix or suffix of the array (including the whole array) fits in a 32 bit integer. Note: Please solve it without division and in O(n).
解法:
例如,给定下图数组 [4, 5, 1, 8, 2, 10, 6]
那么先从左向右轮询乘积一轮:
如下图红色区域:
res[i]=res[i-1]*nums[i-1];
第一行:无红色区域:res[0]=1
第二行:红色区域=4 res[1]=res[0]*nums[0]=1*4
第三行:红色区域=4*5 res[2]=res[1]*nums[1]=1*4*nums[1]=1*4*5
第四行:红色区域=4*5*1 res[3]=res[2]*nums[2]=1*4*5*nums[2]=1*4*5*1
。。。。。。
然后从右往左,同理乘积一轮:
但此时res已经被上一轮乘积占用,只能使用新变量R来记录 从右往左的累计乘积。
如下图黄色区域:
R*=nums[i+1];
res[i]=R*res[i];
最后一行:无黄色区域:R=1, res[6]=1*res[6]
第六行:黄色区域=6:R=R*nums[6]=1*6, res[5]=R*res[5]=6*(4*5*1*8*2)(红色区域<上一轮的结果>)
第五行:黄色区域=6*10:R=R*nums[5]=1*6*10, res[4]=R*res[4]=6*10*(4*5*1*8)(红色区域<上一轮的结果>)
第四行:黄色区域=6*10*2:R=R*nums[4]=1*6*10*2, res[3]=R*res[3]=6*10*2*(4*5*1)(红色区域<上一轮的结果>)
。。。。。。
参考代码:
1 class Solution { 2 public: 3 vector<int> productExceptSelf(vector<int>& nums) { 4 vector<int> res(nums.size()); 5 res[0]=1; 6 for(int i=1; i<nums.size(); i++){ 7 res[i]=nums[i-1]*res[i-1]; 8 } 9 int R=nums[nums.size()-1]; 10 for(int i=nums.size()-2; i>=0; i--){ 11 res[i]=R*res[i]; 12 R*=nums[i]; 13 } 14 return res; 15 } 16 };
来源:https://www.cnblogs.com/habibah-chang/p/12636820.html