[LeetCode/Java] 219. Contains Duplicate II

yuKeon·2023년 8월 31일
0

LeetCode

목록 보기
17/29
post-thumbnail

0. 문제

https://leetcode.com/problems/contains-duplicate-ii/description/?envType=study-plan-v2&envId=top-interview-150


1. 문제 설명

  • 정수 배열 nums와 정수 k가 주어진다.
  • nums 배열 안에 아래의 조건을 만족하는 두 개의 다른 인덱스 i와 j가 존재한다면 true를 반환하라.
    • nums[i]와 nums[j]가 같아야 한다.
    • i - j의 값이 k 이하다

2. 문제 풀이

2.1. 접근법 : 해시맵

  • nums를 탐색한다.
  • 만약 nums[현재 인덱스]의 값을 Key로 가지면서 현재 인덱스 - nums[현재 인덱스]의 Value가 k보다 작다면 true를 반환한다.
  • nums의 탐색이 끝났는데 위 조건을 만족하는 Key-Value를 못 찾았다면 false를 반환한다.

3. 코드

class Solution {
    public boolean containsNearbyDuplicate(int[] nums, int k) {
        HashMap<Integer, Integer> map = new HashMap();

        for (int i = 0; i < nums.length; i++) {
            if (map.containsKey(nums[i]) && i - map.get(nums[i]) <= k)
                return true;
             map.put(nums[i], i);
        }
        return false;
    }
}

4. 결과


5. 개선점

5.1. 시간 복잡도 개선

  • Map의 put 메서드는 반환값이 있다.
  • 새로운 Key 값이면 null을 반환한다.
  • 이미 존재하는 Key 값으로 새로운 Value를 put할 때 기존의 Value를 반환한다.
  • 이를 이용하면 다음과 같은 풀이가 가능하다.
    • nums를 탐색한다.
    • map에 numsi와 i(인덱스)를 넣고 반환값을 구한다.
    • 만약 반환값이 존재하고(이전에 등장한 값) 현재 인덱스(i) - 반환값(이전에 등장했던 인덱스)가 k보다 작으면 true 반환
  • 풀이
class Solution {
    public boolean containsNearbyDuplicate(int[] nums, int k) {
      HashMap<Integer, Integer> map = new HashMap<>();
      int length = nums.length;
      for (int i = 0; i < length; i++) {
        Integer prev = map.put(nums[i], i);
        if (prev != null && i - prev <= k) {
          return true;
        }
      }
    return false;
  }
}
  • 결과

0개의 댓글