《剑指offer》:[52]构建乘积数组
来源:互联网 发布:linux shell编程工具 编辑:程序博客网 时间:2024/05/17 23:08
题目:给定一个数组A[0,1,2...N-1],请构建一个数组B[0,1,2,...N-1],使B中的元素B[i]=A[0]*A[1]*...*A[i-1]*a[i+1]*...*a[n-1],不能使用除法。
解决思路:通过正反两次来求B[i];
正着:B[i]=A[0]*...A[i-1];
反着:temp = B[N]*...B[i+1];
最后通过B[i]*temp就可以求出结果了。
以A[0,1,2,3,4],求B[0,1,2,3,4]为例:
步骤分析:
第一步:b[0] = 1;
第二步:b[1] = b[0] * a[0] = a[0]
第三步:b[2] = b[1] * a[1] = a[0] * a[1];
第四步:b[3] = b[2] * a[2] = a[0] * a[1] * a[2];
第五步:b[4] = b[3] * a[3] = a[0] * a[1] * a[2] * a[3];
然后对于第二个for循环
第一步:
temp *= a[4] = 1*a[4];
b[3] = b[3] * temp = a[0] * a[1] * a[2] * a[4];
第二步:
temp *= a[3] = a[4] * a[3];
b[2] = b[2] * temp = a[0] * a[1] * a[4] * a[3];
第三步:
temp *= a[2] = a[4] * a[3] * a[2];
b[1] = b[1] * temp = a[0] * a[4] * a[3] * a[2];
第四步:
temp *= a[1] = a[4] * a[3] * a[2] * a[1];
b[0] = b[0] * temp = a[4] * a[3] * a[2] * a[1];
具体实现代码如下:
解决思路:通过正反两次来求B[i];
正着:B[i]=A[0]*...A[i-1];
反着:temp = B[N]*...B[i+1];
最后通过B[i]*temp就可以求出结果了。
以A[0,1,2,3,4],求B[0,1,2,3,4]为例:
步骤分析:
第一步:b[0] = 1;
第二步:b[1] = b[0] * a[0] = a[0]
第三步:b[2] = b[1] * a[1] = a[0] * a[1];
第四步:b[3] = b[2] * a[2] = a[0] * a[1] * a[2];
第五步:b[4] = b[3] * a[3] = a[0] * a[1] * a[2] * a[3];
然后对于第二个for循环
第一步:
temp *= a[4] = 1*a[4];
b[3] = b[3] * temp = a[0] * a[1] * a[2] * a[4];
第二步:
temp *= a[3] = a[4] * a[3];
b[2] = b[2] * temp = a[0] * a[1] * a[4] * a[3];
第三步:
temp *= a[2] = a[4] * a[3] * a[2];
b[1] = b[1] * temp = a[0] * a[4] * a[3] * a[2];
第四步:
temp *= a[1] = a[4] * a[3] * a[2] * a[1];
b[0] = b[0] * temp = a[4] * a[3] * a[2] * a[1];
具体实现代码如下:
#include <iostream>using namespace std;#include <vector>vector<int> array1;vector<int> array2(5);void multiply(const vector<int> &array1,vector<int> &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 i=length1-2;i>=0;i--){temp*=array1[i+1];array2[i]*=temp;}}}int main(){for(int i=0;i<5;i++)array1.push_back(i+1);multiply(array1,array2);vector<int>::iterator it1;vector<int>::iterator it2;cout<<"A数组为:";for(it1=array1.begin();it1!=array1.end();it1++)cout<<*it1<<" ";cout<<endl;cout<<"B数组为:";for(it2=array2.begin();it2!=array2.end();it2++)cout<<*it2<<" ";cout<<endl;system("pause");return 0;}
主要是利用中间结果变量。运行结果:
1 0
- 《剑指offer》:[52]构建乘积数组
- 剑指Offer 52 构建乘积数组
- 【剑指offer】题52:构建乘积数组
- 剑指offer 52 构建乘积数组
- 剑指offer--构建乘积数组
- 《剑指offer》构建乘积数组
- 剑指offer-构建乘积数组
- 剑指offer:构建乘积数组
- 剑指offer:构建乘积数组
- 剑指offer:构建乘积数组
- [剑指offer]构建乘积数组
- 剑指offer|构建乘积数组
- 《剑指offer》-构建乘积数组
- 剑指offer 构建乘积数组
- 构建乘积数组--剑指Offer
- 【剑指offer】构建乘积数组
- 《剑指offer》构建乘积数组
- 剑指offer-构建乘积数组
- 移动端touchmove事件边界touchend不触发
- arm交叉编译器gnueabi、none-eabi、arm-eabi、gnueabihf、gnueabi区别
- 55 个实用的大数据可视化分析工具
- 《剑指offer》旋转数组的最小数字
- 基础总结篇之八:创建及调用自己的ContentProvider
- 《剑指offer》:[52]构建乘积数组
- Android URLEncoder 转译中文
- STL之Multimap
- Data URL和图片
- Html类ImageGetter接口
- Python 模块之Logging(一)——Logging HOWTO译文
- OpenCV与EmguCV中的形态学滤波
- mysql 配置文件
- Android实训案例(五)——四大组件之一ContentProvider的使用,通讯录的实现