《劍指offer》:[52]構建乘積陣列
題目:給定一個陣列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;
}
主要是利用中間結果變數。執行結果:
相關文章
- 力扣 - 劍指 Offer 66. 構建乘積陣列力扣陣列
- JZ-051-構建乘積陣列陣列
- 劍指 offer(1) -- 陣列篇陣列
- 劍指offer之順序列印陣列陣列
- 劍指Offer積累-JZ1-二維陣列中的查詢陣列
- 劍指Offer-37-陣列中逆序對陣列
- 【劍指offer】二維陣列中的查詢陣列
- 劍指offer:旋轉陣列的最小數字陣列
- 劍指offer 旋轉陣列的最小數字陣列
- 劍指offer——把陣列排成最小的數C++陣列C++
- 劍指offer——陣列中的逆序對C++(75%)陣列C++
- 劍指Offer--陣列中重複的數字陣列
- 劍指offer-轉陣列的最小數字-php陣列PHP
- 【劍指offer】【1】二維陣列中的查詢陣列
- 劍指Offer-34-把陣列排成最小的數陣列
- nowcoder-劍指offer-二維陣列的查詢陣列
- 劍指 Offer 04. 二維陣列中的查詢陣列
- 【劍指 Offer】11. 旋轉陣列的最小數字陣列
- 劍指 Offer 42.連續子陣列的最大和陣列
- 劍指 Offer 11. 旋轉陣列的最小數字陣列
- 劍指Offer-連續子陣列中的最大和陣列
- 【劍指offer】7.旋轉陣列的最小數字陣列
- 二維陣列中的查詢——牛客劍指offer陣列
- 力扣 - 劍指 Offer 45. 把陣列排成最小的數力扣陣列
- Leetcode 劍指 Offer 03. 陣列中重複的數字LeetCode陣列
- 劍指offer-例題 連續子陣列的最大和陣列
- 《劍指Offer》- 連續子陣列的最大和或最小和陣列
- 1. 二位陣列中的查詢(劍指offer)陣列
- 劍指 offer 第一題: 二維陣列中的查詢陣列
- 【DP】乘積最大子陣列陣列
- 《劍指 Offer》棧實現佇列佇列
- leetcode155. 最小棧 1441. 用棧操作構建陣列 劍指 Offer 09. 用兩個棧實現佇列LeetCode陣列佇列
- 劍指OFFER
- 劍指offer之列印超過陣列一半的數字陣列
- 劍指offer——斐波那契數列
- 劍指 Offer 56 - I. 陣列中數字出現的次數陣列
- 劍指offer刷題之路--1.陣列中重複的數字陣列
- 劍指OFFER-數字在升序陣列中出現的次數(Java)陣列Java
- 劍指Offer-把陣列中的數排成一個最小的數陣列