问题描述:
Given an array of integers, find if the array contains any duplicates. Your function should return true if any value appears at least twice in the array, and it should return false if every element is distinct.
由于之前有写过去处重复元素的题,所以这道题拿到之后第一反应就是给数组排序,然后排完序之后的数组,就很好操作了,从下标1开始看有没有元素和它前面的元素一样。基于这样子的思路,有了下面这段代码
class Solution {
public:
bool containsDuplicate(vector<int>& nums) {
size_t n = nums.size();//先计算出数组的长度,不用在for循环的括号里面每一次的计算
sort(nums.begin(), nums.end());//将数组进行排序
for (size_t i = 1; i < n; i++){
if(nums[i] == nums[i-1]) return true;//能到这里,说明至少有两个元素是一样的,即数组是有重复的。函数返回真
}
return false;
}
};
运行时间还是可以接受的大概在中上水平吧,由于今天刚学习了C++的map知识。想到了如果用map实现一下会怎么样呢?(不是说map的底层时红黑数实现的么,比较牛逼的意思啦)
于是用map实现的代码如下:
class Solution {
public:
bool containsDuplicate(vector<int>& nums) {
unordered_map <int, int> nums2Map;//定义一个map容器
size_t n = nums.size();//理由同上
for(size_t i = 0; i < n; i++){
if(nums2Map.find(nums[i]) != nums2Map.end()) return true;//如果find函数返回值不是容器.end(),说明有重复
nums2Map[nums[i]]++;//如果没有找到,将给元素添加到容器里面,键为nums[i],值为1
}
return false;
}
};
执行结果就懵逼了,,,还没上面的代码快,估计map的优势不是在这里。