Leetcode day4 初级算法-数组-存在重复元素—哈希表

题目

给定一个整数数组,判断是否存在重复元素。

如果存在一值在数组中出现至少两次,函数返回 true 。如果数组中每个元素都不相同,则返回 false 。

第一种方法:排序后再比较

初始代码:暴力求解

class Solution {
public:
    bool containsDuplicate(vector<int>& num) {
        int length = num.size() ;
        if (length == 0) return false;
        for(int left = 0; left<=length-2;left++ ){
            for(int right=left+1;right<=length-1;right++){
                if(num[left] == num[right]) return true;
            }
        }
        return false;
    }
};

没问题,但是超出时间限制,毕竟俩for循化

所以我们

思路:排序后再比较

先对数组进行排序,这样,数值相同的元素会挨在一起,所以我们只需要相邻两元素两两比较即可

class Solution {
public:
    bool containsDuplicate(vector<int>& num) {
        int length = num.size() ;
        sort(num.begin(),num.end());
        for(int i=0;i<length-1;i++){
            if(num[i]==num[i+1]) return true;
        }
        return false;
    }
};

注意:sort 对 vector 的写法

sort(nums.begin(), nums.end());

第二种方法: set集合

思路:

集合中的元素互异,添加的时候如果有重复的,就会覆盖掉之前相同的值,并且返回 false
我们遍历数组中元素加入set 看会不会实现 return false 的情况即可判断

注意:1. 如何建立set

 unordered_set<int> s;

注意:2. int num : arr

int num : arr
迭代器遍历,对于数组来说,等同于
for(int i=0;i<arr.length;i++){
int num = arr[i];
...
}

注意:3. unordered_set 的三个函数

C++ STL 之 unordered_set 使用(包括unordersd_map)
unordered_set 内部实现是基于哈希表(hashtable)

unordered_set::insert
unordered_set::find
unordered_set::erase

查找函数 find() 通过给定主键查找元素
如果s.find()要找的值在set中则返回一个指向该值的迭代器,
如果没有找到则返回s.end()

set<int> s;
if(s.find(x)==s.end())//x不在set s中
{
     s.insert(x);//执行操作
}

代码

class Solution {
public:
    bool containsDuplicate(vector<int>& nums) {
        unordered_set<int> s;
        for(int x: nums){
            if (s.find(x) != s.end()) { //x在set s中
                return true;
            }
            s.insert(x); //x不在set s中 就插入
        }
        return false;
    }
};

你可能感兴趣的:(leetcode初级算法,算法,数据结构,leetcode,哈希表)