238. Product of Array Except Self

冷暖自知 提交于 2020-04-05 16:58:40

问题:

给定数组,求除本位数字以外所有数字之乘积的新数组

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 };

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!