大家练练算法吧..>@

roadingyh 2007-08-15 05:28:48
数组a[N],存放了1至N-1个数,其中某个数重复一次。写一个函数,找出被重复的数字.时间复杂度必须为o(N)函数原型:

int do_dup(int a[],int N)
...全文
140 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
roadingyh 2007-08-21
  • 打赏
  • 举报
回复
top
hzcpig 2007-08-15
  • 打赏
  • 举报
回复
以上对空间的需求可以进行优化。

从一个空间对应一个整形变量可以优化为一个空间对应一bit

分配一个足够大的空间,用bit读取,第N bit表示N这个空间序号对应的数n出现过的次数。

线性扫描,如果N bit为0,赋为1,如果为1,表示已经出现过,判定重复。
hzcpig 2007-08-15
  • 打赏
  • 举报
回复
o(N)的时间必然以巨大的空间消耗为代价。

分配一个足够大的空间,对空间与数之间进行匹配,这个匹配取决于数的取值范围。

如果输入的数是0-65535之间的整数,那么只要65536个空间,分别记录这65535个数出现的次数,线性扫描,将当前数的关联空间加一,如果为2,则表示出现重复。

如果输入的数是0-65535之间的小数,有效数字1位,那么需要65535*10个空间,空间标号与数的匹配函数就是 f(x) = x * 10....

依此类推.......如果允许分配的空间足够大,就可以在o(N)时间内完成该需求。
roadingyh 2007-08-15
  • 打赏
  • 举报
回复
转自C/C++版...

18,773

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 专题技术讨论区
社区管理员
  • 专题技术讨论区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧