[219. Contains Duplicate II] (알고리즘)
Hash Table
문제
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
.
Example 1:
Input: nums = [1,2,3,1], k = 3 Output: true
Example 2:
Input: nums = [1,0,1,1], k = 1 Output: true
Example 3:
Input: nums = [1,2,3,1,2,3], k = 2 Output: false
Constraints:
1 <= nums.length <= 105
-109 <= nums[i] <= 109
0 <= k <= 105
스스로 고민
접근법
- 처음에 무슨 소리인가 했는데 배열안에 K 값이 있고 그 K 값이랑 같은 요소들의 인덱스 값을 마이너스 했을 때 K 값보다 같거나 작으면 True를 반환하면 된다.
- 이전에 사용했던 해시맵을 좀 변형해서 사용하면 될거 같았다.
- 역시 배열 조건에는 음수가 포함된다.
의사코드
- 이전에 사용했던 해시맵을 활용했다.
구현 코드
class Solution:
def containsNearbyDuplicate(self, nums: List[int], k: int) -> bool:
num_dict = {}
for i, num in enumerate(nums):
complement = num
if complement in num_dict:
if abs(i - num_dict[complement]) <= k:
return True
num_dict[num] = i
return False
시간 복잡도와 공간 복잡도
시간 복잡도:
- 반복문이
nums
리스트의 길이인 n번 실행된다. 각 반복에서 수행되는 작업은 O(1) 시간이 걸린다. - 딕셔너리에서 특정 값을 검색하는 작업도 O(1) 시간이 소요된다. 따라서 전체적으로
containsNearbyDuplicate()
메서드의 시간 복잡도는 O(n)다.
공간 복잡도:
num_dict
딕셔너리는 최악의 경우 n개의 숫자를 저장해야 할 수 있으므로 O(n)의 공간이 소요된다.- 나머지 변수들은 상수 개수의 메모리를 사용하므로 공간 복잡도에 영향을 주지 않는다.
- 따라서 전체적으로 공간 복잡도는 O(n) 다.
회고 과정
- 패턴을 공부하라는 게 무슨 소리인지 이해가 되었다.
- 익숙한 패턴이 있으니까 해당 패턴으로 응용해서 푸니까 정말 쉽게 풀었다.
다른 사람 코드를 보고 그 기준으로 어떤 부분을 개선 할 수 있는지 최종 회고
class Solution:
def containsNearbyDuplicate(self, nums: List[int], k: int) -> bool:
#direct, it is a easy problem
dic = dict()
for i,n in enumerate(nums):
if n in dic and i-dic[n]<=k: return True
dic[n] = i
return False
- if 문이 두 개고 따로 추가 조건이 없을 경우에 and로 묶어 버리면 되는데 왜 여태까지 이렇게 생각을 못 한걸까 😂
댓글남기기