📌 LeetCode [1539]: Kth Missing Positive Number
🔗 문제 링크
문제 설명 📄
정렬된 정수 배열 arr
와 정수 k
가 주어질 때, 배열에서 누락된 k번째 양의 정수를 반환합니다.
- 배열
arr
는 1부터 시작하여 양의 정수만 포함합니다.
문제 접근 방식 📋
- 포인터와 카운터 사용:
num
은 현재 숫자를,index
는 배열의 위치를 추적합니다.count
는 누락된 숫자를 추적합니다.
- 누락된 숫자 확인:
- 현재 숫자
num
이 배열arr
에 없는 경우:count
를 증가시키고,num
도 증가시킵니다.
- 현재 숫자
num
이 배열arr
에 있는 경우:- 배열의 다음 위치로 이동하며
num
을 증가시킵니다.
- 배열의 다음 위치로 이동하며
- 현재 숫자
- 반복 조건:
count
가k
에 도달할 때까지 위 작업을 반복합니다.
- 결과 반환:
- 마지막으로 확인된 숫자에서 1을 뺀 값을 반환합니다.
Solution 💻
class Solution:
def findKthPositive(self, arr: List[int], k: int) -> int:
count = 0
index = 0
num = 1
while count != k:
if index >= len(arr):
num += 1
count += 1
else:
if arr[index] > num:
num += 1
count += 1
elif arr[index] == num:
index += 1
num += 1
else:
index += 1
return num - 1
시간 복잡도 분석 ⏲️
- 최악의 경우:
- 배열의 길이가
n
이고k
가 매우 큰 경우, 모든 숫자를 확인해야 하므로 (O(k + n)).
- 배열의 길이가
- 최적의 경우:
- 배열의 길이가 짧고
k
가 작으면 (O(k)).
- 배열의 길이가 짧고
공간 복잡도 분석 🗄️
- 추가 공간 사용:
- 변수
count
,index
,num
만 사용.
- 변수
- 총 공간 복잡도: (O(1)).
리팩토링 🛠️
개선된 코드
class Solution:
def findKthPositive(self, arr: List[int], k: int) -> int:
max_value = max(arr) + k
bitmask = [False] * (max_value + 1)
for num in arr:
bitmask[num] = True
missing_count = 0
for i in range(1, len(bitmask)):
if not bitmask[i]:
missing_count += 1
if missing_count == k:
return i
리팩토링 후 시간 복잡도 ⏲️
- 시간 복잡도:
- 비트마스크 초기화와 탐색: O(max(arr)+k)O(max(arr) + k).
- 공간 복잡도:
- 비트마스크 크기: O(max(arr)+k)O(max(arr) + k).
'알고리즘' 카테고리의 다른 글
LeetCode [2582]: Pass the Pillow (1) | 2024.12.08 |
---|---|
LeetCode [706]: Design HashMap (1) | 2024.12.07 |
LeetCode [860]: Lemonade Change (0) | 2024.12.06 |
LeetCode [1047]: Remove All Adjacent Duplicates In String (1) | 2024.12.05 |
LeetCode [1752]: Check if Array Is Sorted and Rotated (0) | 2024.12.05 |