转自:
http://blog.163.com/strive_only/blog/static/893801682012381819571/
#include <iostream>
if(N<=0)
return;
int i = 0;
pB[N-1] = pA[N-1];
//计算pB[i]=pA[i]*...*pA[N-1]
for( i = N-2; i>= 0;i--) {
pB[i] = pA[i]*pB[i+1];
}
//计算pA[i]=pA[0]*...*pA[i]
for( i = 1; i<N; i++) {
pA[i] *= pA[i-1];
}
//计算pB[i] = pA[i-1]*pB[i+1]
for( i = 0; i<N; i++) {
if(i == 0)
pB[i] = pB[i+1];
else if(i == N-1)
pB[i] = pA[i-1];
else
pB[i] = pA[i-1]*pB[i+1];
}
int A[10], B[10];
int i = 0;
for( i = 0;i<10;i++) {
A[i] = i+1;
}
ConstructB(B, A, 10);
for( i = 0;i<10;i++) {
cout<<B[i]<<" ";
}
cout<<endl;
return 0;
附加题一、
给定一个数组a[N],我们希望构造数组b[N],其中b[i]=a[0]*a[1]*...*a[N-1]/a[i]。在构造过程:
不允许使用除法;
要求O(1)空间复杂度和O(n)时间复杂度;
除遍历计数器与a[N] b[N]外,不可使用新的变量(包括栈临时变量、对空间和全局静态变量等);
请用程序实现并简单描述
解答思路:
首先分解该问题,构建数组C[i] = A[0]*...*A[i], 数组D[i]=A[i]*...*A[N-1],则B[i]=C[i-1]*D[i+1].其中构建C和D的过程使用了动态规划的思想。 而题目要求我们不能使用额外的变量,所以我们考虑重复利用数组A[].
1. 计算B[i] = A[i]*...*A[N-1]
2. 计算A[i] = A[0]*...*A[i]
3. 计算B[i]=A[i-1]*A[i+1]
注意: 上述过程1和2步骤不能调换。如果先执行第一步,A[i]的值已变化,将不能得到正确的结果。
具体代码如下:
using namespace std;
void ConstructB(int pB[], int pA[], int N){
}
int main() {
//初始化数组 A={1,2,...,n}
}