问个小算法,关于判断N个数里面重复的数

mincomp 2008-03-10 01:17:18
一个数组,里面有N个数,值从1-N,在不修改原数组的情况下能否找到时间复杂度O(N),空间复杂度O(1)的方法判断这个数组中有没有两个相同的元素
...全文
1050 53 打赏 收藏 转发到动态 举报
写回复
用AI写文章
53 条回复
切换为时间正序
请发表友善的回复…
发表回复
junglesong 2008-06-12
  • 打赏
  • 举报
回复
http://www.blogjava.net/sitinspring/archive/2008/06/11/207081.html
无病呻吟2 2008-06-11
  • 打赏
  • 举报
回复
N<2的32次方-1,这里的N取什么和我用多少空间没有关系,永远用512M
本来就是O(1)呀
只是使用内存比较大而已呵呵
食人族哲学家 2008-06-10
  • 打赏
  • 举报
回复
有空想想
jmulxg 2008-06-10
  • 打赏
  • 举报
回复
好题目
euroman 2008-06-10
  • 打赏
  • 举报
回复
更正,如果你需要空间复杂度是O(1),假设我们有最好的情况:数组里面元素的排列都是单调的,那么就可以在O(n)时间内,用O(1)的空间解决。但是这个是最好的情况,如果没有经过排序,那么时间复杂度就是O(nlogn),用O(1)空间。所以说按照lz的要求,只能适用于排序后的数组。
cjren 2008-06-08
  • 打赏
  • 举报
回复
Please check this web, it has the answer,
find the duplicate element in an array:
http://aperiodic.net/phil/archives/Geekery/find-duplicate-elements.html
euroman 2008-06-06
  • 打赏
  • 举报
回复
存在O(n)算法

如果你指的N是整数,那么最简单的情况是建立一个以N为长度的数组new array[n], 那么
for i = 1 to N
array[i] = 0;
end;

for i = 1 to N
Array[i]++;
end;

复杂度是O(n),这个算法在analysis and construction of algorithms, author Corman里面有介绍
lidowx 2008-06-06
  • 打赏
  • 举报
回复
[Quote=引用 32 楼 Tiger_Zhao 的回复:]
只需要判断而不需要找到重复值,所以:
将所有数加起来得到 S,如果 S <> (1+N)*N/2 那么就存在重复。
[/Quote]
1+2+3+4 = 10 (没重复)
2+2+3+3 = 10 (有重复)

用 S <> (1+N)*N/2 来判断看来是行不通的
meiZiNick 2008-05-01
  • 打赏
  • 举报
回复
好像没那么简单,呵呵.
xiaoc10 2008-04-28
  • 打赏
  • 举报
回复
mark
smilefox 2008-04-28
  • 打赏
  • 举报
回复
如果有多个重复的,暂时没有想到好办法,比如
2,2,3,4,5,5 。。。

哦,这个也想到了,太蠢了,哈哈
在依次与操作时,记录值,如果是,0,那就继续,不是0,那么马上就知道那个重复了。
然后从下一个开始重头来,,,这样可一解决多个重复的问题:不仅知道重复的,而且还能找出多少个重复。。。
smilefox 2008-04-28
  • 打赏
  • 举报
回复
一次将所有数依次做与操作(&) ,结果是0 ,就是没有重复,如果!= 0 ,就是有重复的
如果!= 0 ,就是有重复的 ,最后的结果就是重复的那个值

如果有多个重复的,暂时没有想到好办法,比如
2,2,3,4,5,5 。。。
smilefox 2008-04-28
  • 打赏
  • 举报
回复
如果只有一个重复的,只有一个好的办法:

一次将所有数依次做与操作(&) ,结果是0 ,就是没有重复,如果!= 0 ,就是有重复的

这个满足时间复杂度O(N) ,空间复杂度O(1)
grellen 2008-04-26
  • 打赏
  • 举报
回复
mark
icansaymyabc 2008-04-26
  • 打赏
  • 举报
回复
注意人家的问题有没有两个相同的元素一楼已经回答出来了,下面跟贴的全是废话。
zhangyue02135 2008-04-25
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 dlyme 的回复:]
“时间复杂度O(N),空间复杂度O(1)”而且还要“在不修改原数组的情况下”
这个要求太苛刻了。

如果确认原数组中最多只有一对重复数字,那可以把数组中的所有元素累加起来,判断和是否等于n*(n+1)/2。如果重复次数完全不受限制,那就想不出别的办法了。
[/Quote]
这个方法有可能导致溢出!
njurain 2008-04-23
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 mathe 的回复:]
其实无论是你这里的+N还是taocp里面求逆序中的改用相反数,本质都相同,都是使用了数据中一些没有被使用的bit位。
而对于这道题目,在n <2^31时,如果可以这样做,还有更加简单的方法。
直接将原数组的最高比特位看作一个比特位数组就可以了

C/C++ code
bool duplicate=false;
for(i=0;i<N;i++){
int x=abs(a[i]);
if(a[x-1]<0){
duplicate=true;
break;
}else{
a[x-1]=-a[x-1];

[/Quote]

这个是正解之一
denghui0815 2008-04-23
  • 打赏
  • 举报
回复
将所有数加起来得到 S,如果 S <> (1+N)*N/2 那么就存在重复。
将所有数乘起来得到 M,如果 M <> N! 那么就存在重复。

只是猜测 没有证明!
baiyizhujian 2008-04-22
  • 打赏
  • 举报
回复
32楼的说法错了
oo 2008-04-22
  • 打赏
  • 举报
回复
mark
加载更多回复(33)

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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