面试题52:构建乘积数组
2015-05-03 10:00
330 查看
题目:给定一个数组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[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1],分为两部分C[i]=A[0]*A[1]*...*A[i-1]和D[i]=A[i+1]*...*A[n-1],B[i]=C[i]*D[i],其中C[i]=C[i-1]*A[i-1],D[i]=D[i+1]*A[i+1]
例如:A[]={1,2,3}求B[]
B[0]=A[1]*A[2]=2*3=6
B[1]=A[0]*A[2]=1*3=3
B[2]=A[0]*A[1]=1*2=2
1.B[0]初始化为1,从下标i=1开始,先求出C[i]的值并放入B[i],即B[i]=C[i]=C[i-1]*A[i-1],所以B[1]=B[1-1]*A[1-1]=B[0]*A[0]=1*1=1,i++
2.B[2]=B[2-1]*A[2-1]=B[1]*A[1]=1*2=2,i++超出长度停止循环
3.C[i]计算完毕求D[i],设置一个临时变量temp初始化为1
4.从后往前变量数组,LengthA=3初始化i=LengthA-2=1,结束条件为i>=0
5.第一次循环,temp=temp*A[i+1]=1*A[2]=3,计算出A中最后一个元素的值放入temp,temp相当于D[i]的值
6.因为之前的B[i]=C[i],所以让B[i]*D[i]就是要保存的结果,即B[i]=B[1]=B[1]*temp=1*3=3,i--=0
7.计算B[i]=B[0],temp上一步中的值是A[2],在这次循环中temp=temp*A[0+1]=A[2]*A[1]=3*2=6
8.B[i]=B[0]=B0]*temp=1*6=6,i--<0循环结束
所以B数组为{6,3,2}
思路:由于B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1],分为两部分C[i]=A[0]*A[1]*...*A[i-1]和D[i]=A[i+1]*...*A[n-1],B[i]=C[i]*D[i],其中C[i]=C[i-1]*A[i-1],D[i]=D[i+1]*A[i+1]
例如:A[]={1,2,3}求B[]
B[0]=A[1]*A[2]=2*3=6
B[1]=A[0]*A[2]=1*3=3
B[2]=A[0]*A[1]=1*2=2
1.B[0]初始化为1,从下标i=1开始,先求出C[i]的值并放入B[i],即B[i]=C[i]=C[i-1]*A[i-1],所以B[1]=B[1-1]*A[1-1]=B[0]*A[0]=1*1=1,i++
2.B[2]=B[2-1]*A[2-1]=B[1]*A[1]=1*2=2,i++超出长度停止循环
3.C[i]计算完毕求D[i],设置一个临时变量temp初始化为1
4.从后往前变量数组,LengthA=3初始化i=LengthA-2=1,结束条件为i>=0
5.第一次循环,temp=temp*A[i+1]=1*A[2]=3,计算出A中最后一个元素的值放入temp,temp相当于D[i]的值
6.因为之前的B[i]=C[i],所以让B[i]*D[i]就是要保存的结果,即B[i]=B[1]=B[1]*temp=1*3=3,i--=0
7.计算B[i]=B[0],temp上一步中的值是A[2],在这次循环中temp=temp*A[0+1]=A[2]*A[1]=3*2=6
8.B[i]=B[0]=B0]*temp=1*6=6,i--<0循环结束
所以B数组为{6,3,2}
#include <iostream> #include <vector> using namespace std; void multiply(const vector<double>& array1,vector<double> & array2) { int length1=array1.size(); int length2=array2.size(); if(length1==length2&&length2>1) { array2[0]=1; for(int i=1;i<length1;i++) { array2[i]=array2[i-1]*array1[i-1]; } double temp=1; for(int j=length1-2;j>=0;j--) { temp*=array1[j+1]; array2[j]*=temp; } } } int main() { vector<double> a1; a1.push_back(1);//在末尾插入元素 a1.push_back(2); a1.push_back(3); vector<double> a2; a2.push_back(0); a2.push_back(0); a2.push_back(0); multiply(a1,a2); vector<double>::iterator it; //遍历vector for(it=a2.begin();it!=a2.end();it++) cout<<*it<<endl; return 0; }
相关文章推荐
- 剑指offer--面试题52:构建乘积数组
- 剑指offer 面试题52 构建乘积数组
- 剑指offer——面试题52:构建乘积数组
- 面试题52: 构建乘积数组
- 《剑指Offer》学习笔记--面试题52:构建乘积数组
- 面试题52 构建乘积数组
- 剑指offer-面试题52-构建乘积数组
- 剑指offer1面试题52 构建乘积数组(java实现)
- 剑指offer-面试题52:构建乘积数组
- 剑指Offer面试题52:构建乘积数组 Java实现
- 【剑指Offer】面试题52:构建乘积数组
- 【剑指Offer学习】【面试题52:构建乘积数组】
- 剑指Offer系列-面试题52:构建乘积数组
- 面试题52:构建乘积数组
- (剑指Offer)面试题52:构建乘积数组
- 剑指offer - 面试题52:构建乘积数组
- 【剑指Offer学习】【面试题52:构建乘积数组】
- 【剑指offer-解题系列(52)】构建乘积数组
- 剑指Offer 52 构建乘积数组
- 【剑指offer】面试题66:构建乘积数组