机器学习和生物信息学实验室论坛联盟MAchine Learning And Bioinformatics, MALAB
查看: 10024|回复: 10

做题:数组运算

 火 [复制链接]
发表于 2012-4-20 13:27:29 | 显示全部楼层 |阅读模式
本帖最后由 tangzk 于 2012-4-20 20:41 编辑

给定长度为N的两个数组a[],b[],要求不使用额外空间和除法运算,得出时间为O(n)的算法完成:

result

result
回复

使用道具 举报

发表于 2012-4-20 18:41:09 | 显示全部楼层
不使用额外空间还好办,不使用除法怎么算啊
回复

使用道具 举报

发表于 2012-4-20 19:49:31 | 显示全部楼层
那个公式是不是有问题呀?为什么数组a有N+1个元素,还有b[i]不就是除了第i个a元素的所有元素的乘积吗?
回复

使用道具 举报

发表于 2012-4-20 19:50:13 | 显示全部楼层
本帖最后由 chenwq 于 2012-4-20 19:50 编辑

b可以写成b1 * b2,其中b1=a[0]*a[1]...*a[i-1],b2=a[i+1]*a[i+2]...*a[N-1],不计算其中的a,就相当于原式子除以a
然后,用两个循环,一个遍历b1,一个遍历b2
  1. package cn.edu.xmu.acm.dp;

  2. public class LP {
  3.         void test(int a[], int b[], int n) {
  4.                 int i;
  5.                 int temp = 1;
  6.                 temp = 1;                               
  7.                 for (i = 1; i < n; i++) {
  8.                         temp *= a[i - 1];               
  9.                         b[i] = temp;
  10.                 }
  11.                 temp = 1;
  12.                 for (i = n - 2; i > 0; i--) {
  13.                         temp *= a[i + 1];       
  14.                         b[i] *= temp;
  15.                 }
  16.                 b[0] = temp * a[1];
  17.                 for (i = 0; i < n; i++) {
  18.                         System.out.println(b[i]);
  19.                 }
  20.         }

  21.         /**
  22.          * @param args
  23.          */
  24.         public static void main(String[] args) {
  25.                 LP lp = new LP();
  26.                 int[] a = new int[10];
  27.                 int[] b = new int[10];
  28.                 for (int i = 0; i < 10; i++) {
  29.                         a[i] = i+1;
  30.                 }
  31.                 lp.test(a, b, 10);
  32.         }
  33. }
复制代码

点评

v5  发表于 2012-4-21 11:42
V  发表于 2012-4-21 10:24
回复

使用道具 举报

 楼主| 发表于 2012-4-20 20:42:11 | 显示全部楼层
fiona 发表于 2012-4-20 19:49
那个公式是不是有问题呀?为什么数组a有N+1个元素,还有b不就是除了第i个a元素的所有元素的乘积吗?

是的,手一抽,公式写多了个等于了。呵呵,已经修正,谢谢师姐!
回复

使用道具 举报

 楼主| 发表于 2012-4-20 21:24:35 | 显示全部楼层
chenwq 发表于 2012-4-20 19:50
b可以写成b1 * b2,其中b1=a[0]*a[1]...*a,b2=a*a...*a[N-1],不计算其中的a,就相当于原式子除以a
然后,用 ...

Good....  
回复

使用道具 举报

发表于 2012-4-21 10:08:55 | 显示全部楼层
看走眼了。。。

捕获.JPG
回复

使用道具 举报

发表于 2012-4-21 10:54:31 | 显示全部楼层
chenwq 发表于 2012-4-20 19:50
b可以写成b1 * b2,其中b1=a[0]*a[1]...*a,b2=a*a...*a[N-1],不计算其中的a,就相当于原式子除以a
然后,用 ...

厉害!
回复

使用道具 举报

发表于 2012-4-22 14:52:16 | 显示全部楼层
fiona 发表于 2012-4-21 10:54
厉害!

您抬举了
回复

使用道具 举报

 楼主| 发表于 2012-4-25 08:03:00 | 显示全部楼层
chenwq 发表于 2012-4-20 19:50
b可以写成b1 * b2,其中b1=a[0]*a[1]...*a,b2=a*a...*a[N-1],不计算其中的a,就相当于原式子除以a
然后,用 ...

可以在Line07设b[0]=1,后面Line17语句放入Line13-16循环内部,如下:
  1. b[0] = 1;
  2. for (int i = 1; i < N; i++) {
  3.         b[i] = b[i - 1] * a[i - 1];
  4. }
  5. int temp = 1;
  6. for (int i = N - 2; i >= 0; i--) {
  7.         temp *= a[i + 1];
  8.         b[i] *= temp;
  9. }
复制代码
不过我也想,有没有可能把temp这个空间也省掉呢?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关注公众号
机器学习和生物信息学实验室联盟

相关侵权、举报、投诉及建议等,请发 E-mail:admin@discuz.vip

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖
关注公众号
返回顶部