
这段代码的算法思想可以用以下步骤来解释:
算法思想
-
使用哈希表(
HashMap)存储每个元素的索引:- 遍历数组
nums时,使用一个HashMap来记录每个元素的值和它的索引位置。这样可以快速查找之前出现过的相同元素的索引。
- 遍历数组
-
检查是否存在符合条件的重复元素:
- 对于数组中的每个元素
nums[i],如果HashMap中已经存在这个元素(即之前已经出现过相同的元素),我们就获取它之前的索引j(即map.get(nums[i]))。 - 然后检查当前索引
i和之前的索引j的距离是否小于或等于k。如果满足条件i - j <= k,就返回true,表示找到了符合条件的重复元素。
- 对于数组中的每个元素
-
更新哈希表:
- 如果
HashMap中不存在当前元素,或者当前元素虽然存在,但它的索引不满足条件i - j <= k,那么就更新HashMap,将当前元素的索引i存储到HashMap中。这样可以确保HashMap中存储的是最近出现的该元素的索引位置。
- 如果
-
遍历完成后返回
false:- 如果遍历完整个数组都没有找到符合条件的重复元素,就返回
false。
- 如果遍历完整个数组都没有找到符合条件的重复元素,就返回
代码复杂度
- 时间复杂度 :
O(n),因为我们只需要遍历一遍数组,且每次在哈希表中查找、插入的时间复杂度都是常数O(1)。 - 空间复杂度 :
O(min(n, k)),因为哈希表中最多只会存储k个最近的元素。
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])) {
int j = map.get(nums[i]);
if(i - j <= k) {
return true;
}
}
map.put(nums[i], i);
}
return false;
}
}