这段代码的算法思想可以用以下步骤来解释:
算法思想
-
使用哈希表(
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
个最近的元素。
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;
}
}