存在重复元素(详细分析,对新手友好)
思路
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循环来暴力破解,不出意外时间超出,一经思考想到了用排序,但是官方题解给出的哈希表确实是之前没有使用过的。对于容器和迭代器的理解较浅,有问题还望指出。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)