Leetcode217. 存在重复元素
217. 存在重复元素
给定一个整数数组,判断是否存在重复元素。
如果存在一值在数组中出现至少两次,函数返回
true
。如果数组中每个元素都不相同,则返回false
。
题意概述:判断给定的数组当中是否有重复元素。
解题报告:
首先想到的是用map做一个映射,对数组当中的所有元素进行遍历,判断是否已经在map当中存在。
class Solution {
public:
bool containsDuplicate(vector<int>& nums) {
map<int,bool> mapp;
int flag=0;
for (int i=0;i<nums.size();i++)
if (!mapp[nums[i]]) mapp[nums[i]]=true;
else flag=1;
return flag;
}
};
但是本题虽然通过,但是性能不算很优。
执行用时:56 ms, 在所有 C++ 提交中击败了10.39%的用户
内存消耗:22.1 MB, 在所有 C++ 提交中击败了5.01%的用户
继续思考一下,想到在第一次判定到flag为1的情况,就可以直接return了。
代码改了一下。
class Solution {
public:
bool containsDuplicate(vector<int>& nums) {
map<int,bool> mapp;
for (int i=0;i<nums.size();i++)
if (!mapp[nums[i]]) mapp[nums[i]]=true;
else return 1;
return 0;
}
};
执行用时:52 ms, 在所有 C++ 提交中击败了14.48%的用户
内存消耗:20.4 MB, 在所有 C++ 提交中击败了17.70%的用户
然后我又想到了先对数组排个序,然后在扫一遍会不会更快一点?
class Solution {
public:
bool containsDuplicate(vector<int>& nums) {
sort(nums.begin(),nums.end());
for (int i=0;i<nums.size()-1;i++)
if (nums[i]==nums[i+1]) return 1;
return 0;
}
};
执行用时:20 ms, 在所有 C++ 提交中击败了89.37%的用户
内存消耗:15.2 MB, 在所有 C++ 提交中击败了78.83%的用户
到这里应该结束了,在翻阅题解的时候发现有人使用的不是map而是set,联系到set作为集合本身就具有互异性,把数组当中所有元素添加进set之后,判断set的大小是否与原数组大小相等就可以知道在原数组当中是否存在有重复元素。
可能是set这一容器本身被忽略得比较多,忽有一种茅塞顿开之感()
下面是set容器的一些函数
c++ stl容器set成员函数:begin()--返回指向第一个元素的迭代器
c++ stl容器set成员函数:clear()--清除所有元素
c++ stl容器set成员函数:count()--返回某个值元素的个数
c++ stl容器set成员函数:empty()--如果集合为空,返回true
c++ stl容器set成员函数:end()--返回指向最后一个元素下一个位置的迭代器
c++ stl容器set成员函数:equal_range()--返回集合中与给定值相等的上下限的两个迭代器
c++ stl容器set成员函数:erase()--删除集合中的元素
c++ stl容器set成员函数:find()--返回一个指向被查找到元素的迭代器
c++ stl容器set成员函数:get_allocator()--返回集合的分配器
c++ stl容器set成员函数:insert()--在集合中插入元素
c++ stl容器set成员函数:lower_bound()--返回指向大于(或等于)某值的第一个元素的迭代器
c++ stl容器set成员函数:key_comp()--返回一个用于元素间值比较的函数
c++ stl容器set成员函数:max_size()--返回集合能容纳的元素的最大限值
c++ stl容器set成员函数:rbegin()--返回指向集合中最后一个元素的反向迭代器
c++ stl容器set成员函数:rend()--返回指向集合中第一个元素的反向迭代器
c++ stl容器set成员函数:size()--集合中元素的数目
c++ stl容器set成员函数:swap()--交换两个集合变量
c++ stl容器set成员函数:upper_bound()--返回大于某个值元素的迭代器
c++ stl容器set成员函数:value_comp()--返回一个用于比较元素间的值的函数
class Solution {
public:
bool containsDuplicate(vector<int>& nums) {
set<int> s;
for (int i=0;i<nums.size();i++)
if (s.count(nums[i])) return 1;
else s.insert(nums[i]);
return 0;
}
};
执行用时:48 ms, 在所有 C++ 提交中击败了19.86%的用户
内存消耗:20.5 MB, 在所有 C++ 提交中击败了12.77%的用户