Given an integer array nums
and an integer k
, return true if there are two distinct indices i
and j
in the array such that nums[i] == nums[j]
and abs(i - j) <= k
.
nums
, 두 숫자 사이 거리 k
i != j
, nums[i] == nums[j]
, abs(i - j) <= k
를 만족하는 [i, j]
가 존재하는가?전략 1. 이중 반복문 비교
i (0 <= i <= nums.length)
번째 위치와 i+j (1 <= j <= k)
번째 위치와의 원소 비교true
를 반환 전략 2. 자료구조 Set 이용
0
번째 부터 k-1
번째까지 Set에 넣음true
를 반환i (k <= i < nums.length)
를 순회하면서i
번째 원소를 Set에서 중복 확인, 중복이 있다면true
를 반환i
번째 원소를 Set에 넣고, i - k
번째 원소를 Set에서 제거class Solution {
public boolean containsNearbyDuplicate(int[] nums, int k) {
for (int i = 0; i < nums.length; i++) {
for (int j = i + 1; j < Math.min(i + k + 1, nums.length); j++) {
if (nums[i] == nums[j]) {
return true;
}
}
}
return false;
}
}
class Solution {
public boolean containsNearbyDuplicate(int[] nums, int k) {
Set<Integer> targets = new HashSet<>();
for (int i = 0; i < Math.min(k, nums.length); i++) {
if (targets.contains(nums[i])) {
return true;
}
targets.add(nums[i]);
}
for (int i = k; i < nums.length; i++) {
if (targets.contains(nums[i])) {
return true;
}
targets.add(nums[i]);
targets.remove(nums[i - k]);
}
return false;
}
}
기본 전략
Map
을 사용함k
보다 작은 경우 true
를 반환함Set을 이용할 때와의 성능차이
class Solution {
public boolean containsNearbyDuplicate(int[] nums, int k) {
Map<Integer, Integer> letterToIndex = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
Integer prev = letterToIndex.put(nums[i], i);
if (prev != null && i - prev <= k) {
return true;
}
}
return false;
}
}