一天一到算法题——乘积分析
2014-08-05 10:41
211 查看
给你一个数组
如果直接暴力,时间为O(n^2),所以要优化
我们看到 B[i]=A[1]*......A[i-1]*A[i+1]*......A
;
分成两份:第一部分是A[1]*......A[i-1] 第二部分是A[i+1]*......A
所以,计算B[i+1]时,就是用B[i]的第一部分乘上A[i]得到B[i+1]的第一部分而第二部分,得到A[i+1]*......A
,要再得到A[i]*A[i+1]*......A
,只需乘上A[i],
另开数组C,DC[i]=A[1]*......A[i-1]=C[i-1]*A[i-1];D[i]=A[i+1]*......A
=D[i+1]*A[i+1];
这是自己写的,有错误请指出
A[1..n],请你在
O(n)的时间里构造一个新的数组
B[1..n],使得
B[i]=A[1]*A[2]*...*A /A[i]。你不能使用除法运算。
如果直接暴力,时间为O(n^2),所以要优化
我们看到 B[i]=A[1]*......A[i-1]*A[i+1]*......A
;
分成两份:第一部分是A[1]*......A[i-1] 第二部分是A[i+1]*......A
所以,计算B[i+1]时,就是用B[i]的第一部分乘上A[i]得到B[i+1]的第一部分而第二部分,得到A[i+1]*......A
,要再得到A[i]*A[i+1]*......A
,只需乘上A[i],
另开数组C,DC[i]=A[1]*......A[i-1]=C[i-1]*A[i-1];D[i]=A[i+1]*......A
=D[i+1]*A[i+1];
这是自己写的,有错误请指出
#include<stdio.h> int a[100],b[100],c[100],d[100]; int main() { int n; while(~scanf("%d",&n)) { int i,j; c[0]=1; d[n+1]=1; a[0]=1; a[n+1]=1; for(i=1;i<=n;i++) { scanf("%d",&a[i]); c[i]=c[i-1]*a[i-1]; } for(i=n;i>=0;i--) d[i]=d[i+1]*a[i+1]; for(i=1;i<=n;i++) { b[i]=c[i]*d[i]; printf("%d ", b[i]); } printf("\n"); } return 0; }
相关文章推荐
- 长度为n的整数数组,找出其中任意(n-1)个乘积最大的那一组,只能用乘法,不可 以用除法。要求对算法的时间复杂度和空间复杂度作出分析,可以写思路也可以写程序。
- 面试算法题:忘我之乘积分析
- 一天一道算法题——数对数目分析
- 循环冗余校验CRC的算法分析和程序实现
- 冒泡排序的算法分析与改进
- 计算任何一天是星期几的几种算法
- 计算任何一天是星期几的几种算法 转自asp.net
- 计算任何一天是星期几的几种算法
- 贪吃蛇的算法分析(1)
- 组合算法的程序实现及分析比较
- 冒泡排序的算法分析与改进
- 日历查询的算法 如何计算某一天是星期几
- diablo2002’s crackme1算法分析
- zz 超级拖拉机 4.02 破解算法分析
- XoftSpy 4.13的注册算法分析 zz
- Windows脚本编码器算法分析与破译
- 贪吃蛇的算法分析(3)
- 计算任何一天是星期几的几种算法-ZT
- Windows脚本编码器算法分析与破译
- 从算法的角度分析ERP、APS与MES的关系