给定一个数组a[N],我们希望构造数组b [N],其中b[j]=a[0]*a[1]…a[N-1] / a[j],在构造过程中,不允许使用除法:要求O(1)空间复杂度和O(n)的时间复杂度;除遍历计数器与a[N] b[N]外,不可使用新的变量(包括栈临时变量、堆空间和全局静态变量等)
#include <stdio.h>
void function(int a[], int b[], int n)
{
int i;
b[0] = 1;
for(i=1;i<n;i++) //循环1
{
b[i] = b[i-1] * a[i-1];
}
for(i=n-1;i>=1;i--) //循环2
{
b[i] *= b[0];
b[0] *= a[i];
}
}
int main()
{
int a[4] = {1,2,3,4};
int b[4] = {0};
int i;
function(a,b,4);
printf("转换前:\n");
for(i=0;i<4;++i)
printf("%d\t",a[i]);
printf("\n");
printf("转换后:\n");
for(i=0;i<4;++i)
printf("%d\t",b[i]);
printf("\n");
return 0;
}
结果:
分析:
b[i] = a[0]*a[1]*a[2].....a[i-1] * a[i+1]......a[n-1]
循环1的作用是先实现b[i]左半部分,即a[0]到a[i-1]连乘
b[i] = a[0]*a[1]*a[2].....a[i-1]
循环2的作用是再实现b[i]右半部分,即a[i+1]到a[n-1]连乘
b[i] = a[0]*a[1]*a[2].....a[i-1]*a[i+1]......a[n-1]