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