(剑指Offer)面试题52:构建乘积数组
2015-07-31 21:19
671 查看
题目:
给定一个数组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]。不能使用除法。思路:
方法1:直接连乘n-1个数,得到B[i];
时间复杂度:O(n^2)
方法2:
构建前向乘积数组C[i]=A[0]*A[1]*...*A[i-1],即C[i]=C[i-1]*A[i-1];
构建后向乘积数组D[i]=A[n-1]*A[n-2]*...A[n-i+1],即D[i]=D[i+1]*A[i+1];
通过C[i],D[i]来求B[i]:B[i]=C[i]*D[i]
时间复杂度:O(n)
代码:
void multiply(const vector<double>& array1,vector<double>& array2){ int len1=array1.size(); int len2=array2.size(); if(len1==len2 && len2>1){ array2[0]=1; for(int i=1;i<len1;i++){ array2[i]=array2[i-1]*array1[i-1]; } double tmp=1; for(int i=len1-2;i>=0;i--){ tmp*=array1[i+1]; array2[i]*=tmp; } } }
在线测试OJ:
http://www.nowcoder.com/books/coding-interviews/94a4d381a68b47b7a8bed86f2975db46?rp=3AC代码:
class Solution { public: vector<int> multiply(const vector<int>& A) { int len=A.size(); if(len<1) return vector<int>(); vector<int> B(len,1); for(int i=1;i<len;i++){ B[i]*=B[i-1]*A[i-1]; } int tmp=1; for(int i=len-2;i>=0;i--){ tmp*=A[i+1]; B[i]*=tmp; } return B; } };
class Solution { public: vector<int> multiply(const vector<int>& A) { int len=A.size(); if(len<1) return vector<int>(); vector<int> B(len,1); vector<int> front(len,1); vector<int> back(len,1); for(int i=1;i<len;i++){ front[i]=front[i-1]*A[i-1]; } for(int i=len-2;i>=0;i--){ back[i]=back[i+1]*A[i+1]; } for(int i=0;i<len;i++) B[i]=front[i]*back[i]; return B; } };
相关文章推荐
- 面试准备---Java异常
- 剑指offer面试题36数组中的逆序对数
- 剑指Offer面试题13(java版):在O(1)时间删除链表节点
- 互联网公司机器学习数据挖掘类的职位面试主要考察哪些?
- 面试准备--JAVA集合框架
- (剑指Offer)面试题51:数组中重复的数字
- 数据挖掘工程师面试指南
- 黑马程序员---iOS基础---OC的开始
- 剑指Offer面试题12(Java版):打印1到最大的n位数
- (剑指Offer)面试题50:树中两个结点的最低公共祖先
- 程序员学英语--毕业后的第一个月
- 黑马程序员-ios学习笔记 Foundation 中的 NSString
- 黑马程序员------多线程
- 黑马程序员--学习OC中类和对象
- 面试百问
- 记一次我在华为和中兴的面试经历
- [转]115个Java面试题和答案——终极列表(下)
- [转]115个Java面试题和答案——终极列表(上)
- 面试题:java中的访问控制符优先级和输出6+6+"java"+6+6的结果
- 【剑指Offer面试题】 九度OJ1366:栈的压入、弹出序列