LeetCode217:存在重复元素(排序和哈希表)

题目:

给你一个整数数组nums。如果任一值在数组中出现至少两次 ,返回true ;如果数组中每个元素互不相同,返回false 

来源:力扣(LeetCode)

链接:217. 存在重复元素 - 力扣(LeetCode)https://leetcode.cn/problems/contains-duplicate/?envType=study-plan&id=shu-ju-jie-gou-ru-men&plan=data-structures&plan_progress=b584641

题目中给出的class Solution定义: 

class Solution {
public:
    bool containsDuplicate(vector<int>& nums) {

    }
};

浅分析一下:

  1. 函数为bool类型,因为返回值为True或False
  2. vector<int> nums:nums是一个容器变量,容器名称为vector,容器内存的数据为int型
  3. vector<int> & nums:nums是一个引用,引用的内容是名为vector这个容器内部存放的整型数据
  4. vector容器是STL中常见的容器,在C++中使用vector之前要有:#include<vector>     using namespace std;

本人一开始的作答:(两个for走天下)

class Solution {
public:
    bool containsDuplicate(vector<int>& nums) {
        int i, j;
        for (i = 0; i < nums.size(); i++)
        {
            for (j = i+1; j < nums.size(); j++) {
                if (nums[i] == nums[j]) {
                    return true;
                }
            }
        }
        return false;
    }
};

提交结果:超出时间限制

分析:时间复杂度太高

标准题解1(排序法):

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

来源:力扣(LeetCode)

分析:

  1. 直接调用C++库的sort函数对整型数据进行排序
  2. sort函数:是C++标准库里的排序函数,可以直接调用,时间复杂度为n*log2(n)。sort函数的三个参数:第一个,排序数组的起始地址;第二个,结束地址;第三个,排序方法,没有写默认是从小到大,也可以采用排序原则:(也可以对字符进行排序) 
    1. less<数据类型>()//从小到大排序
    2. greater<数据类型>()//从大到小排序
    3. 示例:sort(nums.begin(), nums.end(), less<int>() );
  3. 排序之后直接用for循环判断相邻两数是否相等,相等即为True。这一步的时间复杂度为n

标准题解2(哈希表):

class Solution {
public:
    bool containsDuplicate(vector<int>& nums) {
        unordered_set<int> s;
        for (int x: nums) {
            if (s.find(x) != s.end()) {
                return true;
            }
            s.insert(x);
        }
        return false;
    }
};

来源:力扣(LeetCode)

分析:

  1. unordered_set<int> s; unordered_set 容器,可直译为“无序 set 容器”。即 unordered_set 容器和 set 容器很像,唯一的区别就在于 set 容器会自行对存储的数据进行排序,而 unordered_set 容器不会。
  2. unordered_set函数的几个特性:不再以键值对存储数据,直接存储数据的值;容器内部存储的各个元素数据互不相等,且不能被修改;不会对内部存储的元素进行排序。
  3. for(int x : nums),运用for循环,依次将nums的值赋值给x。(拷贝)
  4. s.find(x),运用unordered_set内置的find函数来查找值,找到返回迭代器,失败返回end()。
  5. s.insert(x),表示在s容器中插入值为x的元素。在本题中,如已经先在s中插入了一个整型数据6,容器nums中还有第二个6;将第二个6赋值给x后,在s中查找,找到6,返回迭代器而不是end(),所以if条件成立,return true。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值