问题描述
给定一个整数数组和一个整数 k,判断数组中是否存在两个不同的索引 i 和 j,使得 nums [i] = nums [j],并且 i 和 j 的差的绝对值最大为 k。
示例
输入: nums = [1,2,3,1], k = 3
输出: true
输入: nums = [1,0,1,1], k = 1
输出: true
输入: nums = [1,2,3,1,2,3], k = 2
输出: false
分析
这个坑题。我一开始是以为重复元素最多只有2个。(我TM哪来的神推断,可能是因为我看了示例1就开干了)。然后又以为是等于k,事实证明了带眼睛做题的重要性。
好了,言归正传。
我是这么做的:维持了一个HashMap
。 以nums[i]
为key
,以i
为value
。
对于nums[i]
,如果HashMap
中没有,就把它加进去,有就判定他们两个的距离,如果小于等于k
,皆大欢喜,return true
. 如果大于k
,证明这俩不合适,直接把前面的k-v
给替换成当前最新的kv
。(方法一)
还有种办法是维护了一个长度为k+1
的滑动窗口。利用HashSet
维护的。如果这个k+1
长度的HashSet
都没有重复元素,证明是没有符合条件的了,往右滑动即可。(方法二)
方法一
Java版
class Solution {
public boolean containsNearbyDuplicate(int[] nums, int k) {
Map<Integer,Integer> map = new HashMap<>();
for(int i = 0; i < nums.length; i++){
if(map.containsKey(nums[i])){
if(i-map.get(nums[i]) <= k){
return true;
}else if(i-map.get(nums[i]) > k){
map.replace(nums[i],i);
}
}else{
map.put(nums[i],i);
}
}
return false;
}
}
方法二
Java版
class Solution {
public boolean containsNearbyDuplicate(int[] nums, int k) {
Set<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;
}
}