238. Product of Array Except Self &构建乘积数组
2016-02-26 22:08
411 查看
题目描述
Given an array of n integers where n > 1, nums, return an array output such that output[i] is equal to the product of all the elements of nums except nums[i].Solve it without division and in O(n).
For example, given [1,2,3,4], return [24,12,8,6].
给定一个数组A[0,1,…,n-1],请构建一个数组B[0,1,…,n-1],其中B中的元素B[i]=A[0]*A[1] *…*A[i-1]*A[i+1]*…*A[n-1]。不能使用除法。
解答
如果可以使用除法,可以使用公式来求得B[i]。但是使用除法时,要特别注意A[i]等于0的情况。
我们可以把B[i]=A[0]*A[1] *…*A[i-1]*A[i+1]*…*A[n-1]分成两部分,看作是A[0]*A[1] *…*A[i-1]和A[i+1]*…*A[n-1]两部分的乘积。所以B可以使用一个矩形来创建。
定义C[i] =A[0]*A[1] *…*A[i-1],D[i]=A[i+1]*…*A[n-1]。C[i]可以使用自上而下的顺序计算出来,即C[i] = C[i-1]*A[i-1]。类似的,D[i]可以自下而上的计算,即D[i] = D[i+1]*A[i+1]。
vector<int> multiply(const vector<int>& A) { vector<int> ret; //注意resize和reserve ret.resize(A.size()); for(int i = 0;i<ret.size();++i) ret[i]=1; ret[0] = 1; //求C[i] for(int i = 1;i < A.size();++i) { ret[i] *=ret[i-1]*A[i-1]; } //使用tmp求D[i],并求最终结果 int tmp = 1; for(int i = A.size()-2;i>=0;--i) { tmp *=A[i+1]; ret[i] *=tmp; } return ret; }
class Solution { public: vector<int> productExceptSelf(vector<int>& nums) { vector<int> nums1(nums.size(),1); vector<int> nums2(nums.size(),1); vector<int> ret(nums.size(),1); for(int i = 1;i<nums.size();++i) { nums1[i] = nums1[i-1] * nums[i-1]; } for(int j = nums.size() -2;j>=0;--j) { nums2[j] = nums2[j+1] *nums[j+1]; } for(int i = 0;i< nums.size();++i) { ret[i] = nums1[i] * nums2[i]; } return ret; } };
相关文章推荐
- POJ 3281 Dining(最大流)
- 推送(本地Local Notification)
- 机器学习之K-近邻算法(kNN算法)
- uva10763 - Foreign Exchange
- @RequestMapping之用法
- Android Fragment 真正的完全解析(下)
- shell编程练习001(20160226)
- 函数:声明和表达式
- 最简单的基于FFmpeg的移动端例子:Android 视频解码器
- java中IO的用法
- 【bzoj1604】: [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居
- 编程知识汇总--OpenAL
- 2016
- BZOJ_P2049&Codevs_P1839 [SDOI2008]Cave 洞穴勘测(LCT)
- Property 'date' not found on type java.lang.String] with root cause解决方案
- 添加、删除约束
- 监听Android系统Log
- 图片查看器-向左 向右 切换图片或内容
- 机器学习笔记1—感知器(Perceptron)
- Android 自定义Toast