除己外乘积
问题描述:
对于一个数组A[N],要求生成一个新的数组B[N]。对数组B的要求是B[i] = A[0] * A[1]…*A[i - 1] * A[i+ 1]*…*A[N],也就是不包括A[i]的剩余元素之积。不准用除法,要求时间复杂度为O[N]。
解法:直接上程序
#include <stdio.h> int main() { int a[5] = {1, 2, 3, 4, 5}; int b[5]; int a1[6], a2[6]; a1[0] = 1; a2[5] = 1; int j = 0; for (int i = 0; i < 5; i++) { a1[i + 1] = a1[i] * a[i]; j = 5 - i; a2[j - 1] = a2[j] * a[j - 1]; } for (int i = 0; i < 5; i++) { b[i] = a1[i] * a2[i + 1]; printf("%d\t", b[i]); } printf("\n"); return 0; }
因为b[i] = a[0] * ... *a[i - 1] * a[i + 1] * ... * a[n -1];
可以令f1(i) = a[0] * ... *a[i - 1]; f2(i) = a[i + 1] * ... * a[n -1];
直接用a1, a2两个数组来记录[0..n)的所有结果,供后边计算使用,最后所需要时间复杂度为O(n)
分享下同学的答案,空间复杂度控制在O(1)上:http://blog.csdn.net/huagong_adu/article/details/7457948