面试题,看看数组是否有重复值,请用o(n)时间复杂算法编写

yu_deqing 2010-11-07 06:12:07
有一个int数组,1<=x[i]<=1000,看看x是否有重复值,请用o(n)时间复杂算法编写

最好详细点。
...全文
467 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
Carmack Jiang 2010-11-11
  • 打赏
  • 举报
回复
桶式排序

int y[1000];
memset(y,0,1000*sizeof(int));
for(int i =0;i < sizeof(x)/sizeof(int);i ++)
{
if(y[x[i]])
cout << "duplicate"<<endl;
else
y[x[i]] = 1;
}
}
無_1024 2010-11-10
  • 打赏
  • 举报
回复
已经解决了啊
gengchenhui 2010-11-09
  • 打赏
  • 举报
回复
算法啊?能考这个,估计应该公司不算小吧?
超级大笨狼 2010-11-09
  • 打赏
  • 举报
回复
重复值,o(n)时间只是输入的时间,每次判断可以做到O(1)
哈希表可以做到。

1<=x[i]<=1000这个范围,用桶就可以了,准备个1000长的数组,直接按照下标去插入。

如果输入量大于1000直接就可以认为有重复,鸽笼原理。

marswyz 2010-11-08
  • 打赏
  • 举报
回复
位图不就行了吗,遍历一次就够了
lz89love 2010-11-08
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 yui 的回复:]
值空间连续且大小只有1000,只需要32个元素的无符号整型数组即可表达这个值空间,每一个比特代表一个取值,初始时各比特都是0,遍历题目给定的int数组的时候设置相应的值空间数组比特位为1,当遇到一个值空间数组的比特已经为1时,说明该int数组必定有重复值。该算法的时间复杂度是O(n),至于具体做法,首先要弄清楚计数排序的思想,请参考

http://blog.csdn.net/yui/arch……
[/Quote]


好,说的有道理、、
dreams2018 2010-11-08
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 dyzhxsl 的回复:]
再开个1000的数组flag[1001],全置false。
然后从x[0]开始,flag[x[i]]如果为true的话则有重复,重复值为x[i],如果为flag[x[i]]为false的话则令flag[x[i]]为true。
时间O(n),空间消耗就一个1000的布尔数组。
[/Quote]
方法很好,赞一个
yui 2010-11-07
  • 打赏
  • 举报
回复
值空间连续且大小只有1000,只需要32个元素的无符号整型数组即可表达这个值空间,每一个比特代表一个取值,初始时各比特都是0,遍历题目给定的int数组的时候设置相应的值空间数组比特位为1,当遇到一个值空间数组的比特已经为1时,说明该int数组必定有重复值。该算法的时间复杂度是O(n),至于具体做法,首先要弄清楚计数排序的思想,请参考

http://blog.csdn.net/yui/archive/2010/11/01/5980112.aspx
cap77 2010-11-07
  • 打赏
  • 举报
回复
支持下四楼的
学习...
sf_first 2010-11-07
  • 打赏
  • 举报
回复
用ASCII码实现桶排序
WizardOz 2010-11-07
  • 打赏
  • 举报
回复

int check(int arr[],int len) {
char bitmap[128];
int i;

assert(len < 1024);

memset(bitmap,0,128);
for (i = 0; i < len; ++i) {
if (bitmap[arr[i] >> 3] & (1 << (arr[i] & 7)))
return 1;

bitmap[arr[i] >> 3] |= 1 << (arr[i] & 7);
}

return 0;
}
cap77 2010-11-07
  • 打赏
  • 举报
回复
申请记录每个值出现次数的数组:

int hash[1001]={0};
for(int i=0;i<n;++i)
hash[x[i]]++;
for(int j=1;j<1001;++j)
{
if(hash[j]>1)
{
cout<<"有重复"<<endl;
break;
}
}
dyzhxsl 2010-11-07
  • 打赏
  • 举报
回复
当然,做这之前还可以先判断下,如果x[n]数组长度大于1000的话必然导致有重复。
dyzhxsl 2010-11-07
  • 打赏
  • 举报
回复
再开个1000的数组flag[1001],全置false。
然后从x[0]开始,flag[x[i]]如果为true的话则有重复,重复值为x[i],如果为flag[x[i]]为false的话则令flag[x[i]]为true。
时间O(n),空间消耗就一个1000的布尔数组。

33,027

社区成员

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

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