机器学习和生物信息学实验室联盟

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 6066|回复: 10
打印 上一主题 下一主题

做题:数组运算

  [复制链接]
跳转到指定楼层
楼主
发表于 2012-4-20 13:27:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 tangzk 于 2012-4-20 20:41 编辑

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 转播转播 分享分享
回复

使用道具 举报

沙发
发表于 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
发表于 2012-4-21 10:24
回复 支持 反对

使用道具 举报

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

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

使用道具 举报

6#
 楼主| 发表于 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....  
回复 支持 反对

使用道具 举报

7#
发表于 2012-4-21 10:08:55 | 只看该作者
看走眼了。。。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

8#
发表于 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
然后,用 ...

厉害!
回复 支持 反对

使用道具 举报

9#
发表于 2012-4-22 14:52:16 | 只看该作者
fiona 发表于 2012-4-21 10:54
厉害!

您抬举了
回复 支持 反对

使用道具 举报

10#
 楼主| 发表于 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这个空间也省掉呢?
回复 支持 反对

使用道具 举报

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

本版积分规则

机器学习和生物信息学实验室联盟  

GMT+8, 2024-5-19 12:23 , Processed in 0.072275 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表