题目:
给你一个整数数组nums。如果任一值在数组中出现至少两次 ,返回true ;如果数组中每个元素互不相同,返回false 。
来源:力扣(LeetCode)
题目中给出的class Solution定义:
class Solution {
public:
bool containsDuplicate(vector<int>& nums) {
}
};
浅分析一下:
- 函数为bool类型,因为返回值为True或False
- vector<int> nums:nums是一个容器变量,容器名称为vector,容器内存的数据为int型
- vector<int> & nums:nums是一个引用,引用的内容是名为vector这个容器内部存放的整型数据
- 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)
分析:
- 直接调用C++库的sort函数对整型数据进行排序
- sort函数:是C++标准库里的排序函数,可以直接调用,时间复杂度为n*log2(n)。sort函数的三个参数:第一个,排序数组的起始地址;第二个,结束地址;第三个,排序方法,没有写默认是从小到大,也可以采用排序原则:(也可以对字符进行排序)
- less<数据类型>()//从小到大排序
- greater<数据类型>()//从大到小排序
- 示例:sort(nums.begin(), nums.end(), less<int>() );
- 排序之后直接用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)
分析:
- unordered_set<int> s; unordered_set 容器,可直译为“无序 set 容器”。即 unordered_set 容器和 set 容器很像,唯一的区别就在于 set 容器会自行对存储的数据进行排序,而 unordered_set 容器不会。
- unordered_set函数的几个特性:不再以键值对存储数据,直接存储数据的值;容器内部存储的各个元素数据互不相等,且不能被修改;不会对内部存储的元素进行排序。
- for(int x : nums),运用for循环,依次将nums的值赋值给x。(拷贝)
- s.find(x),运用unordered_set内置的find函数来查找值,找到返回迭代器,失败返回end()。
- s.insert(x),表示在s容器中插入值为x的元素。在本题中,如已经先在s中插入了一个整型数据6,容器nums中还有第二个6;将第二个6赋值给x后,在s中查找,找到6,返回迭代器而不是end(),所以if条件成立,return true。