题解 | #数组中重复的数字#
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param numbers int整型vector
* @return int整型
*/
int duplicate(vector<int>& numbers) {
// write code here
unordered_set<int> s;
for(int i=0; i<numbers.size(); i++){
if(s.count(numbers[i])==0){
s.insert(numbers[i]);
}
else return numbers[i];
}
return -1;
}
};
set基于红黑树实现,红黑树具有自动排序的功能,因此map内部所有的数据,在任何时候,都是有序的。
unordered_set基于哈希表,数据插入和查找的时间复杂度很低,几乎是常数时间,而代价是消耗比较多的内存,无自动排序功能。底层实现上,使用一个下标范围比较大的数组来存储元素,形成很多的桶,利用hash函数对key进行映射到不同区域进行保存。
一次循环依次遍历数组,并与查询hash表(hash表采用unordered_set容器,而不要采用set,unordered_set底层使用的vector+list开链法,理论查询时间O(1),set底层采用红黑树,查询时间稳定log(n)):1、hash表存在该数字,结束返回结果;2、hash表不存在该数字,将该数字加入hash表中;循环结束代表未找到,返回-1;