一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第12天,点击查看活动详情。
一、问题描述
给你一个整数数组 nums
。如果任一值在数组中出现 至少两次 ,返回 true
;如果数组中每个元素互不相同,返回 false
。
题目链接:存在重复元素
二、题目要求
样例 1
输入: nums = [1,2,3,1]
输出: true
复制代码
样例 2
输入: nums = [1,2,3,4]
输出: false
复制代码
考察
1.哈希表、排序、判重
2.建议用时10~25min
复制代码
三、问题分析
这一题比较简单,主要还是考察判断重复元素的思想。不要一开始就用双重for循环判断,会超时的。
有下面几种代替方法:づ ̄ 3 ̄)づ
1.哈希计数
先循环遍历数组元素,用哈希表存储每一个数字出现的次数,如果存储的时候发现这个数字出现过了,就返回true,否则最后返回false;
2.set存储
set有一个特点,存入的重复元素会自动跳过,不在存储。
所以,有重复元素的数组经过set之后,长度肯定变小。
3.排序判断
排序如何判断重复元素呢?
首先,以样例 1为例,排序后的结果是:
1 1 2 3
复制代码
第一个数字不需要判断,从第二个数字开始,如果与前一个数字相同,就返回true,否则返回true;
四、编码实现
1.哈希计数
class Solution {
public:
bool containsDuplicate(vector<int>& nums) {
int i,n=nums.size();//初始化
map<int,int>m;//哈希计数
for(i=0;i<n;i++)
{
m[nums[i]]++;//计数
if(m[nums[i]]>=2)//条件判断
return true;
}
return false;
}
};
复制代码
2.set存储
class Solution {
public:
bool containsDuplicate(vector<int>& nums) {
int i,n=nums.size();//初始化
set<int>s;//set存储
for(i=0;i<n;i++)
s.insert(nums[i]);//插入
if(s.size()<n)//发现数组长度变小,存在重复元素
return true;
else
return false;
}
};
复制代码
3.排序判断
class Solution {
public:
bool containsDuplicate(vector<int>& nums) {
int i,n=nums.size();//初始化
sort(nums.begin(),nums.end());//排序
for(i=1;i<n;i++)
if(nums[i]==nums[i-1])//判重
return true;
return false;
}
};
复制代码
五、测试结果
总体来看,三种方法都差不多,非要比较的话,第三种好一点。