思路:查找表 + 滑动窗口(窗口大小固定)
class Solution { public boolean containsNearbyDuplicate(int[] nums, int k) { /** * 方法1:哈希 */ /* Map<Integer,Integer> map = new HashMap<>(); for (int i = 0; i < nums.length; i++) { if (map.containsKey(nums[i])) { if (i - map.get(nums[i]) <= k) return true; } map.put(nums[i], i); // hashMap中存入数字及其在数组中最后出现的索引 } return false; */ /** * 方法2:查找表 + 滑动窗口 * [l, l+k] 窗口一共有 k + 1个元素 */ Set<Integer> set = new HashSet<>(); for (int i = 0; i < nums.length; i++) { if (set.contains(nums[i])) return true; set.add(nums[i]); if (set.size() == k + 1) { // 保持set中最多有 k 个元素 set.remove(nums[i - k]); } } return false; } }