社区
数据结构与算法
帖子详情
问个小算法,关于判断N个数里面重复的数
mincomp
2008-03-10 01:17:18
一个数组,里面有N个数,值从1-N,在不修改原数组的情况下能否找到时间复杂度O(N),空间复杂度O(1)的方法判断这个数组中有没有两个相同的元素
...全文
1050
53
打赏
收藏
问个小算法,关于判断N个数里面重复的数
一个数组,里面有N个数,值从1-N,在不修改原数组的情况下能否找到时间复杂度O(N),空间复杂度O(1)的方法判断这个数组中有没有两个相同的元素
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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)
2021-10-24:快乐
数
。编写一个
算法
来
判断
一
个
数
n 是不是快乐
数
。「快乐
数
」定义为:对于一个正整
数
,每一次将该
数
替换为它每个位置上的
数
字的平方和。然后
重复
这个过程直到这
个
数
变为 1,也可能是
编写一个
算法
来
判断
一
个
数
n 是不是快乐
数
。「快乐
数
」定义为:对于一个正整
数
,每一次将该
数
替换为它每个位置上的
数
字的平方和。然后
重复
这个过程直到这
个
数
变为 1,也可能是 无限循环 但始终变不到 1。如果 可以...
编写一个
算法
来
判断
一
个
数
n 是不是快乐
数
「快乐
数
」定义为:对于一个正整
数
,每一次将该
数
替换为它每个位置上的
数
字的平方和,然后
重复
这个过程直到这
个
数
变为 1,也可能是 无限循环 但始终变不到 1。如果 可以变为 1,那么这
个
数
就是快乐
数
。 如果 n 是...
java实现---编写一个
算法
来
判断
一
个
数
是不是“快乐
数
”。
编写一个
算法
来
判断
一
个
数
是不是“快乐
数
”。一个“快乐
数
”定义为:对于一个正整
数
,每一次将该
数
替换为它每个位置上的
数
字的平方和,然后
重复
这个过程直到这
个
数
变为 1,也可能是无限循环但始终变不到 1。如果可以...
如何实现从M
个
数
字选取N
个
数
字排列
算法
在第一份工作结束的时候,还是个java小白,找工作的时候去面试,碰到一个
算法
题:从十
个
数
字中选取八
个
数
字排列,
重复
算一个,一共有多少种可能?当时想了半天也没想出来,虽然是
数
学上的排列组合
算法
,但是还是想...
算法
——寻找
重复
的
数
给定一个包含n + 1 个整
数
的
数
组nums,其
数
字都在 1 到 n之间(包括 1 和 n),可知至少存在一个
重复
的整
数
。假设只有一个
重复
的整
数
,找出这个
重复
的
数
。 示例 1: 输入: [1,3,4,2,2] 输出: 2 示例 2: 输入: [3...
数据结构与算法
33,008
社区成员
35,326
社区内容
发帖
与我相关
我的任务
数据结构与算法
数据结构与算法相关内容讨论专区
复制链接
扫一扫
分享
社区描述
数据结构与算法相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章