1.存在重复元素
给定一个整数数组,判断是否存在重复元素。如果存在一值在数组中出现至少两次,函数返回 true 。如果数组中每个元素都不相同,则返回 false 。
考察知识点:哈希表
class Solution {
public:
bool containsDuplicate(vector<int>& nums) {
unordered_map<int,int> mp;
for(int i=0;i<nums.size();++i)
{
if(mp[nums[i]]>0)
return true;
++mp[nums[i]];
}
return false;
}
};
2.存在重复元素 II
给定一个整数数组和一个整数 k,判断数组中是否存在两个不同的索引 i 和 j,使得 nums [i] = nums [j],并且 i 和 j 的差的 绝对值 至多为 k。
考察知识点:哈希表
class Solution {
public:
bool containsNearbyDuplicate(vector<int>& nums, int k) {
unordered_map<int,int> mp;
for(int i=0;i<nums.size();++i)
{
if(mp.find(nums[i])!=mp.end())
if(i-mp[nums[i]]<=k)
return true;
mp[nums[i]]=i;
}
return false;
}
};
3.存在重复元素 III
给你一个整数数组 nums 和两个整数 k 和 t 。请你判断是否存在 两个不同下标 i 和 j,使得 abs(nums[i] - nums[j]) <= t ,同时又满足 abs(i - j) <= k 。如果存在则返回 true,不存在返回 false。
考察知识点:滑动窗口+有序集合
class Solution {
public:
bool containsNearbyAlmostDuplicate(vector<int>& nums, int k, int t) {
if (nums.size() <= 1 || k <= 0)
return false;
set<long int> st;
for (int i = 0; i < nums.size(); i++)
{
long int num = nums[i];
auto it = st.lower_bound(num - t); //返回第一个大于等于num的位置
if (it != st.end() && *it <= num + t)
return true;
st.insert(num);
if (i >= k)
st.erase(nums[i - k]); //*
}
return false;
}
};