一、题目描述
判断数组中是否存在两个不同的索引i和j,使得nums[i] = nums[j],并且i和j的绝对差不超过k
二、实现代码
public class Solution {
public bool ContainsNearbyDuplicate(int[] nums, int k) {
// 哈希集合维护一个最多k个元素的滑动窗口
HashSet<int> window = new HashSet<int>();
for (int i = 0; i < nums.Length; i++) {
// 当前元素已在窗口内,直接返回true
if (window.Contains(nums[i]))
return true;
window.Add(nums[i]); // 将当前元素加入窗口
// 维护窗口大小不超过k,移除最早进入的元素
if (window.Count > k)
window.Remove(nums[i - k]);
}
return false;
}
}
三、算法思想
窗口动态维护:用哈希集合维护一个最大容量为
k的窗口,存储最近访问的k个元素即时检测机制:新元素加入前检查是否已存在窗口中,实现O(1)时间检测
空间智能控制:窗口大小严格限制为
k,空间复杂度从O(n)优化至O(k)
维度 值 说明 时间复杂度 O(n) 每个元素最多被插入/删除一次 空间复杂度 O(k) 窗口最多存储k+1个元素
547

被折叠的 条评论
为什么被折叠?



