描述
在一个长度为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;
}
标签:03,set,数字,容器,重复,复杂度,数组
From: https://www.cnblogs.com/H43724334/p/18123363