存在重复元素(详细分析,对新手友好)

思路

1.数量很大,不能直接暴力破解,需要先用复杂度较小的排序,再判断是否存在两个相邻的数相等的情况,时间复杂度为nlogn;

  • 学习了容器vector

  • 学习了sort函数void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp);

    • 也就是首元素和尾元素的下一位,可用begin和end函数

    • sort函数类似于快排,时间复杂度较低

    • 数组中,直接写数组名不加下标,等于首元素地址,相当于指针,可直接加数组长度表示尾元素地址的下一个地址{

      sort(arr,arr+10) == sort (vector.begin(),vector.end())

      }

  • size函数可以直接应用于vector容器

  • 数组只能用sizeof(arr)/sizeof(a[0])

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

2.排序后再进行比较,时间复杂度为nlogn,我们还可以通过哈希表来降低T(n),

  • 理解set,map容器的概念,有序,无序,可重复等基本概念
  • 选用set作为容器,将数组数作为关键字,选用无序的不可重复set容器,将输入的数组遍历,每个数判断是否在set中存在。
  • 选择s.find(x) == s.end() 作为条件,若相等说明容器中没有此关键字,使用insert(x)函数插入,若不相等,说明容器中已存在此数,直接返回true。
  • find()函数返回值是一个迭代器,由auto a来定义,a->first = 返回此数的关键字,如果是map,a->second= 返回此关键字的值对。
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;
    }
};

此代码块为力扣官方题解,准确有效。

第一次遇到这个题目,作者选用两个for循环来暴力破解,不出意外时间超出,一经思考想到了用排序,但是官方题解给出的哈希表确实是之前没有使用过的。对于容器和迭代器的理解较浅,有问题还望指出。

posted @   ku然  阅读(72)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示