文章目录
- 🍈217. 存在重复元素
- 🍌1. 题目
- 🍏2. 算法原理
- 🍓3. 代码实现
- 🎃219. 存在重复元素 II
- 🎄题目
- 🎆算法原理
- 🧨代码实现
🍈217. 存在重复元素
🍌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
🍏2. 算法原理
这题找重复元素,当然了,可以直接暴力枚举,看看有没有相同的元素。时间复杂度为O(N2)。
力扣的简单题,基本上都可以使用暴力解法。
但是有一点,要看这个数据量,比如这个题目的数据量范围为[1,10^5]
,O(N2)大概率超时。这里我没试,想试的可以自己试试。
快速查找元素,哈希表在行,遍历数组,看看是否有元素在哈希表中,没有就丢进去,继续遍历;有就直接返回,时间复杂度为O(N)。
这些不在乎下标,只需要可以
key
值,所以用unordered_set
即可
🍓3. 代码实现
class Solution {
public:bool containsDuplicate(vector<int>& nums){unordered_set<int> hash;for(auto e : nums){if(hash.count(e)) return true;else hash.insert(e);}return false;}
};
运行结果:
🎃219. 存在重复元素 II
🎄题目
题目链接:219. 存在重复元素 II
给你一个整数数组 nums
和一个整数 k
,判断数组中是否存在两个 不同的索引 i
和 j
,满足 nums[i] == nums[j]
且 abs(i - j) <= k
。如果存在,返回 true
;否则,返回 false
。
示例 1:
输入:nums = [1,2,3,1], k = 3
输出:true
示例 2:
输入:nums = [1,0,1,1], k = 1
输出:true
示例 3:
输入:nums = [1,2,3,1,2,3], k = 2
输出:false
提示:
- 1 <= nums.length <= 105
- -109 <= nums[i] <= 109
- 0 <= k <= 105
🎆算法原理
这题和上面这题类似,只不过需要记录下标,看看是否两个相同元素的下标差的绝对值是否<=k
,哈希表里面存元素和对应的下标<nums[i],i>
。
这里可能有多个相同的值,涉及到覆盖,这里不用担心,直接覆盖即可。
因为要求是<=k
,隔得越近越小
🧨代码实现
class Solution {
public:bool containsNearbyDuplicate(vector<int>& nums, int k){unordered_map<int, int> hash;for(int i=0; i<nums.size(); i++){if(hash.count(nums[i])){if(abs(hash[nums[i]] - i) <= k) return true; }hash[nums[i]] = i;}return false;}
};
运行结果: