题目描述
给定一个整数数组和一个整数 k,判断数组中是否存在两个不同的索引 i 和 j,使得 nums [i] = nums [j],并且 i 和 j 的差的绝对值最大为 k。
输入: nums = [1,2,3,1], k = 3
输出: true
解题思路
用哈希表即可,简单题。
- 更简单的实现方式请见题解:
- 维护一个哈希表,里面始终最多包含
k
个元素,当出现重复值时则说明在k
距离内存在重复元素。 - 每次遍历一个元素则将其加入哈希表中,如果哈希表的大小大于
k
,则移除最先进入哈希表的数字。
- 维护一个哈希表,里面始终最多包含
参考代码
我的实现
class Solution {
public:
bool containsNearbyDuplicate(vector<int>& nums, int k) {
int length = nums.size();
if(length <= 1)
return false;
unordered_map<int, unordered_set<int>> umap;
for(int i = 0; i < length; i++){
if(umap.count(nums[i]) > 0){
unordered_set<int> uset = umap[nums[i]];
for(auto elem: uset){
if(abs(i - elem) <= k)
return true;
}
}
umap[nums[i]].insert(i);
}
return false;
}
};
更简单的实现:
class Solution {
public boolean containsNearbyDuplicate(int[] nums, int k) {
HashSet<Integer> set = new HashSet<>();
for(int i = 0; i < nums.length; i++) {
if(set.contains(nums[i])) {
return true;
}
set.add(nums[i]);
if(set.size() > k) {
set.remove(nums[i - k]);
}
}
return false;
}
}
来源:CSDN
作者:aift
链接:https://blog.csdn.net/ft_sunshine/article/details/104228889