[Binary Search, Two Pointers] Find K-th Smallest Pair Distance분명 전산학부 졸업 했는데 코딩 개못하는 조준호/알고리즘 초고수 조준호2024. 8. 17. 23:17
728x90
반응형
✨ 인사이트
가능한 모든 쌍을 찾으면 아주 쉽겠지만 그건 O(n^2)가 걸린다. 이게 왜 Hard 난이도인지 생각해야 한다. O(nlogn)만에 끝낼 수는 없을까?
list에서 두 요소를 뽑았을 때 그 차이가 임의의 수 m보다 작은 경우를 모두 구하려면 얼마나 걸릴까? O(n)이 걸린다. Two Pointers를 사용하면 된다.
그렇다면 우리가 해야 할 일은 m의 값을 list에서 뽑은 두 요소의 최솟값과 최댓값 사이를 Binary Search를 통해 조절하며 k에 가깝게 다가가는 것이다. 이 경우 O(logn)이 걸리기 때문에 곱하면 총 O(nlogn)이 나온다.
👟 알고리즘 설명
1. nums를 정렬해서 이후 사용할 Two Pointers의 기반을 다진다.
2. 주어진 숫자 distance보다 작은 차이를 가지는 list 내의 두 요소 쌍의 개수를 구하는 함수 countLessOrEqual(distance: int)를 정의한다.
3. Binary Search를 사용할 시작점 low를 0으로 두고, high는 가장 큰 차이로 둔다. (list내 모든 숫자가 달라서 차이값이 0인 쌍이 없을 수도 있지만 이건 그냥 가능한 range를 최대한 넉넉하게 잡아둔 것이기 때문에 상관없다.)
4. Binary Search가 끝나고 남은 high가 정답!💡
✅ 정답
Time Complexity: O(nlogn)
Space Complexity: O(1)
class Solution:
def smallestDistancePair(self, nums: List[int], k: int) -> int:
nums.sort()
length = len(nums)
def countLessOrEqual(distance: int):
cnt = 0
ptr1 = 0
for ptr2 in range(1, length):
while nums[ptr2] - nums[ptr1] > distance: ptr1 += 1
cnt += ptr2 - ptr1
return cnt
low = 0
high = nums[-1] - nums[0]
while low < high:
mid = (low + high) // 2
if countLessOrEqual(mid) < k: low = mid + 1
else: high = mid
return high
728x90
반응형
'분명 전산학부 졸업 했는데 코딩 개못하는 조준호 > 알고리즘 초고수 조준호' 카테고리의 다른 글
[Hash Table, Linked List] Delete Nodes From Linked List Present in Array (1) | 2024.09.06 |
---|---|
[Array] Find the Student that Will Replace the Chalk (0) | 2024.09.03 |
[Backtracking] Combination Sum II (0) | 2024.08.17 |
[BFS, DFS] Regions Cut By Slashes (0) | 2024.08.17 |
[DP] Filling Bookcase Shelves (0) | 2024.08.17 |
@팜팜이S :: 팜팜은행: 한국은행 총재 조준호
한국은행 들어갈 때까지만 합니다
조만간 티비에서 봅시다