《劍指offer》:[52]構建乘積數組
來源:程序員人生 發布時間:2016-07-08 16:08:33 閱讀次數:2606次
題目:給定1個數組A[0,1,2...N⑴],請構建1個數組B[0,1,2,...N⑴],使B中的元素B[i]=A[0]*A[1]*...*A[i⑴]*a[i+1]*...*a[n⑴],不能使用除法。
解決思路:通過正反兩次來求B[i];
正著:B[i]=A[0]*...A[i⑴];
反著:temp = B[N]*...B[i+1];
最后通過B[i]*temp就能夠求出結果了。
以A[0,1,2,3,4],求B[0,1,2,3,4]為例:
步驟分析:
第1步:b[0] = 1;
第2步:b[1] = b[0] * a[0] = a[0]
第3步:b[2] = b[1] * a[1] = a[0] * a[1];
第4步:b[3] = b[2] * a[2] = a[0] * a[1] * a[2];
第5步:b[4] = b[3] * a[3] = a[0] * a[1] * a[2] * a[3];
然后對第2個for循環
第1步:
temp *= a[4] = 1*a[4];
b[3] = b[3] * temp = a[0] * a[1] * a[2] * a[4];
第2步:
temp *= a[3] = a[4] * a[3];
b[2] = b[2] * temp = a[0] * a[1] * a[4] * a[3];
第3步:
temp *= a[2] = a[4] * a[3] * a[2];
b[1] = b[1] * temp = a[0] * a[4] * a[3] * a[2];
第4步:
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⑴]*array1[i⑴];
}
double temp=1;
for(int i=length1⑵;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;
}
主要是利用中間結果變量。運行結果:

生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈