LeetCode 219 存在重复元素 II
给你一个整数数组 nums
和一个整数 k
,判断数组中是否存在两个 不同的索引 i
和 j
,满足 nums[i] == nums[j]
且 abs(i - j) <= k
。如果存在,返回 true
;否则,返回 false
。
示例 1:
输入:nums = [1,2,3,1], k = 3 输出:true
示例 2:
输入:nums = [1,0,1,1], k = 1 输出:true
示例 3:
输入:nums = [1,2,3,1,2,3], k = 2 输出:false
哈希表 和滑动窗口
-
方法一
/** * 哈希 * * @param nums * @param k * @return */ public static boolean containsNearbyDuplicate1(int[] nums, int k) { if (nums == null) { return false; } // 保存每个元素出现的位置 Map<Integer, List<Integer>> integers = new HashMap<>(); for (int i = 0; i < nums.length; i++) { int tmp = nums[i]; // 当前元素如果重复出现,判断之前出现的下标位置是否和当前位置的距离超过k List<Integer> integerList = integers.getOrDefault(tmp, new ArrayList<>()); for (int j = 0; j < integerList.size(); j++) { // 判断是否出现满足条件的元素 if (i - integerList.get(j) <= k) { return true; } } // 没有出现则需要将当前位置加入到当前元素的位置链表中 integerList.add(i); integers.put(tmp, integerList); } return false; }
-
方法二
/** * 滑动窗口 * * @param nums * @param k * @return */ public static boolean containsNearbyDuplicate02(int[] nums, int k) { if (nums == null) { return false; } for (int i = 0; i < nums.length - 1; i++) { for (int j = i + 1; j < nums.length && j <= i + k; j++) { if (nums[i] == nums[j]) { return true; } } } return false; }
-
方法三
/**
* 滑动窗口+ 哈希
*
* @param nums
* @param k
* @return
*/
public static boolean containsNearbyDuplicate(int[] nums, int k) {
if (nums == null) {
return false;
}
Set<Integer> integerSet = new HashSet<>();
for (int i = 0; i < nums.length; i++) {
if (i > k) {
integerSet.remove(nums[i - k - 1]);
}
if (integerSet.contains(nums[i])) {
return true;
}
integerSet.add(nums[i]);
}
return false;
}
测试用例
public static void main(String[] args) {
int[] nums = new int[]{1, 2, 3, 1};
int k = 3;
boolean flag = ContainsNearbyDuplicate.containsNearbyDuplicate(nums, k);
System.out.println("ContainsNearbyDuplicate demo01 result : " + flag);
nums = new int[]{1, 0, 1, 1};
k = 1;
flag = ContainsNearbyDuplicate.containsNearbyDuplicate(nums, k);
System.out.println("ContainsNearbyDuplicate demo02 result : " + flag);
nums = new int[]{1, 2, 3, 1, 2, 3};
k = 2;
flag = ContainsNearbyDuplicate.containsNearbyDuplicate(nums, k);
System.out.println("ContainsNearbyDuplicate demo03 result : " + flag);
nums = new int[]{2, 2};
k = 3;
flag = ContainsNearbyDuplicate.containsNearbyDuplicate(nums, k);
System.out.println("ContainsNearbyDuplicate demo04 result : " + flag);
}
测试结果
ContainsNearbyDuplicate demo01 result : true
ContainsNearbyDuplicate demo02 result : true
ContainsNearbyDuplicate demo03 result : false
ContainsNearbyDuplicate demo04 result : true