219. 存在重复元素 II-Easy
题目描述:
给你一个整数数组 nums
和一个整数 k
,判断数组中是否存在两个 不同的索引 i
和 j
,满足 nums[i] == nums[j]
且 abs(i - j) <= k
。如果存在,返回 true
;否则,返回 false
。
解题思路:
一、Map保存元素-下标对应关系,每次查询到重复元素,下标相减判断其是否小于等于k;超过k,更新为新的下标(由于按照下标依次历遍——》新的下标比之前的下标更接近之后的重复元素);若没有超过,返回true
二、Set保存元素,每次只判断[i-k,i]之内的元素,每次增长下标(i++),移除i-k-1,添加i的元素判断是否有重复
代码实现:
//解法一
class Solution {
public boolean containsNearbyDuplicate(int[] nums, int k) {
Map<Integer,Integer> map = new HashMap<>();
int length = nums.length;
for (int i = 0; i < length; i++) {
//如果put一个已有的键值,返回原值,否则返回null
Integer pre=map.put(nums[i],i);
if(pre!=null){
if(i-pre<=k)
return true;
}
}
return false;
}
}
//解法二
class Solution {
public boolean containsNearbyDuplicate(int[] nums, int k) {
Set<Integer> set = new HashSet<Integer>();
int length = nums.length;
for (int i = 0; i < length; i++) {
//如果i超过k,每次移除i-k,i之外的一个元素,维持窗口长度为k
if (i > k) {
set.remove(nums[i - k - 1]);
}
//重复添加返回null,加入窗口的同时判断窗口内是否有与之重复
if (!set.add(nums[i])) {
return true;
}
}
return false;
}
}