03数组中重复的数字

描述

在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组[2,3,1,0,2,5,3],那么对应的输出是2或者3。存在不合法的输入的话输出-1

数据范围:
0≤n≤10000
进阶:时间复杂度O(n) ,空间复杂度O(n)
示例1:
输入:[2,3,1,0,2,5,3]
返回值:2
说明:2或3都是对的

方法1:
采容器,对容器中的元素进行排序,然后判断是否有重复的数字。
时间复杂度O(nlogn)

int duplicate(vector<int>& numbers) {
// write code here
sort(numbers.begin(), numbers.end());
for(int i =0; i<numbers.size(); i++)
{
if(numbers[i] == numbers[i+1])
return numbers[i];
}
return -1;
}

方法2:
采用set容器,创建一个set容器,在数组中找set末尾元素,如果没找到,就将数组的元素i插入到set容器中,如果找到了,就返回i。
否则就是返回-1。
set是关联式容器,用来存储同一数据类型,且set中的每个元素的值都是唯一的,系统会根据元素的值自动进行排序。
时间复杂度O(n) , 空间复杂度O(n)

int duplicate(vector<int>& numbers) {
// write code here
set<int> s;
for(int i =0; i<numbers.size(); i++)
{
if( s.find(numbers[i]) ==s.end())
s.insert(numbers[i]);
else
return numbers[i];
}
return -1;
}
posted @   蓝色的海嗷  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示