目录结构
1.题目
给定一个整数数组和一个整数 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
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/contains-duplicate-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2.题解
2.1滑动窗口
当前元素始终与索引差值绝对值在k之内的窗口内的元素比较。
public class Solution219 {
public boolean containsNearbyDuplicate(int[] nums, int k) {
for (int i = 0; i < nums.length; i++) {
for (int j = 1; j <= k; j++) {
if (i + j < nums.length) {
if (nums[i] == nums[i + j]) {
return true;
}
} else {
break;
}
}
}
return false;
}
}
- 时间复杂度:
- 空间复杂度:
2.2哈希表
维护一个大小为k的哈希表:
- 若哈希表内存在当前元素,返回true;
- 若哈希表未满且哈希表内不存在当前元素,则将当前元素存入;
- 若哈希表已满且哈希表内不存在当前元素,则将哈希表内最久远的元素删除,将当前元素存入。
重复上述过程,直至数组遍历结束。
public class Solution219 {
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;
} else {
set.add(nums[i]);
if (set.size() > k) {
set.remove(nums[i - k]);
}
}
}
return false;
}
}
- 时间复杂度:
- 空间复杂度: