算法题每日一练---第77天:存在重复元素

一起养成写作习惯!这是我参与「掘金日新计划 · 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;
    }
};
复制代码

五、测试结果

1.png

2.png

3.png

总体来看,三种方法都差不多,非要比较的话,第三种好一点。

猜你喜欢

转载自juejin.im/post/7085502678817734686