一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第1天,点击查看活动详情。
首先看题目:
217、给你一个整数数组 nums 。如果任一值在数组中出现 至少两次 ,返回 true ;如果数组中每个元素互不相同,返回 false 。
示例 1: 输入:nums = [1,2,3,1]
输出:true
示例 2: 输入:nums = [1,2,3,4]
输出:false
示例 3: 输入:nums = [1,1,1,3,3,4,3,2,4,2]
输出:true
其次,一定要注意提示中限定的范围:
1 <= nums.length <= 105-109 <= nums[i] <= 109
这是一道经典一看就是用hash(哈希)表解决的问题。可能有的同学不懂哈希表,我简单说一下,(仅仅用于简单说明,不是专业解答)。
哈希表简单点说就是:把一个元素放到一个容器(哈希表)中,取出来的时候时间复杂度是o(1),
[1]、hash表,代码如下
class Solution {
public:
bool containsDuplicate(vector<int>&nums) {
unordered_set<int>u; //建立哈希表
for (int x: nums) {//利用一个叫做x的变量遍历nums这个容器
if (u.find(x) != u.end()) {//检查一下x变量所存储的值是否已经存在了哈希表u中
return true;
}
u.insert(x);//往哈希表u中插入元素
}
return false;
}
};
[2]、排序后判断
简单说一下第二种,开始我也没有想到这个,是看了别人写的代码才理解。
bool containsDuplicate(vector<int>& nums) {
sort(nums.begin(), nums.end());//c++STL标准库中写的函数,使用之前请#include<algorithm>
int n=nums.size();//注意为什么要用这个n,因为nums.size()返回的是无符号数,和整数判断容易出错,详细要去学习计算机组成原理,这里不细说
for (int i = 0; i < n - 1; i++) {//注意这里i<n-1,而不是我们常写的i<n,否则i+1会越界
if (nums[i] == nums[i + 1]) {
return true;
}
}
return false;
}