如何在 O(n) 运行时间内从答案中删除重复项?
void findodd(int a[])
{
int hash[100];
int i;
int c[100]={0};
for(i=0;i<6;i++)
{
c[a[i]]=c[a[i]]+1;
hash[a[i]]=c[a[i]];
if(c[a[i]]%2==0)
hash[a[i]]=0;
}
for(i=0;i<6;i++)
if(hash[a[i]]!=0)
cout<<a[i];
}
int main()
{
int a[] = {1,3,3,5,5,5};
findodd(a);
return 0;
}
该程序的目的是找出数组中出现奇数次的整数。这是上述程序的链接。
void findodd(int a[])
{
int hash[100];
int i;
int c[100]={0};
for(i=0;i<6;i++)
{
c[a[i]]=c[a[i]]+1;
hash[a[i]]=c[a[i]];
if(c[a[i]]%2==0)
hash[a[i]]=0;
}
for(i=0;i<6;i++)
if(hash[a[i]]!=0)
cout<<a[i];
}
int main()
{
int a[] = {1,3,3,5,5,5};
findodd(a);
return 0;
}
The program is to find the integers which occur odd number of times in the array. Here is the link to the above program.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
鉴于您的算法已经在 O(n) 上运行,我假设您希望删除输出中的重复条目。一种可能的解决方案是:
Given that your algorithm already runs on O(n), I assume you are looking to erase the duplicate entries in your output. One possible solution is:
但您可能最好使用 std::vector 和/或 std::map 。
负数:但仅限于 -100 -> 范围内+100。数组索引不能为负,因此只需为所有数组添加
+100
并使用从 0 到 200 的hash
数组。使用
std::vector
和std::map
(适用于正数和负数)But you might be better of using
std::vector
and/orstd::map
.With negatives : but only in the range -100 -> +100. You cant have a negative array index, so just
+100
to all and have thehash
array from 0 to 200.With
std::vector
andstd::map
(works both for positive and negative numbers)唯一的一点是您是否知道条目的边界,如果输入类型有限,那么上面的所有代码都可以工作,但是如果您不知道边界或者边界太高(例如您有整数范围的条目),那么即使最好的算法也使用 O(nlogn) 来删除重复的条目。
the only point is if you know boundries for your entries or not, if there is a limited types of input then all the codes above would work but if you don't know the boundries or if the boundries are too high (for example you have an integer range of entries) then even the best algorithm use O(nlogn) to remove dublicate entries.