LeetCode/NeetCode

BST: 704. Binary Search

hyunkookim 2025. 1. 21. 08:46

704. Binary Search

 

class Solution:
    def search(self, nums: List[int], target: int) -> int:
        def bst(l, r):
            while l<=r:
                mid = (l+r)//2
                if nums[mid] < target:
                    l = mid+1
                elif nums[mid] > target:
                    r =mid -1
                else:
                    return mid

            return -1

        return bst(0, len(nums)-1)

 

https://youtu.be/s4DPM8ct1pI?si=E2bD8-D_rcUUtBXz

 

 

최종 코드

 

class Solution:
    def search(self, nums: List[int], target: int) -> int:
        l, r = 0, len(nums)-1

        while l<=r:
            m = (l+r)//2
            if nums[m] < target:
                # l+=1
                l = m+1
            elif nums[m] > target:
                # r-=1
                r = m-1
            else:
                return m
        # print(l, r)
        return -1

 

while l <= r: vs while l < r: 는 binary search(이진 탐색)에서 루프의 종료 조건에 따라 달라짐

각각의 차이를 쉽게 이해할 수 있게 아래에 정리해드릴게요.


✅ while l <= r:

  • 가장 일반적인 형태
  • l과 r이 같은 위치일 때도 탐색을 수행함
  • 모든 인덱스를 포함해서 검사할 수 있음
  • ✔️ 타겟의 인덱스를 찾을 때 주로 사용

예시:

while l <= r:
    m = (l + r) // 2
    if nums[m] < target:
        l = m + 1
    elif nums[m] > target:
        r = m - 1
    else:
        return m

이렇게 하면 l == r일 때도 마지막으로 한 번 비교하게 되어, 인덱스를 정확히 찾을 수 있어요.


✅ while l < r:

  • 범위를 좁혀가는 탐색 (예: 첫 번째 만족하는 위치, 최소값 찾기 등)
  • l == r이 되는 순간은 이미 찾았다고 가정
  • 종료 후 l이나 r이 정답 후보가 됨
  • ✔️ lower bound, upper bound 같은 위치 계산할 때 사용

예시 (lower bound 찾기):

while l < r:
    m = (l + r) // 2
    if nums[m] < target:
        l = m + 1
    else:
        r = m

이렇게 하면 target 이상(>= target)이 처음 나오는 위치를 찾을 수 있어요.


🔍 핵심 차이 요약

조건 의미 사용 예
l <= r 마지막 원소까지 탐색 정확한 값(인덱스) 찾기
l < r 최소/최대 조건 위치 탐색 lower bound, upper bound, 조건 만족 위치

'LeetCode > NeetCode' 카테고리의 다른 글

Graphs: 695. Max Area of Island ★  (0) 2025.01.23
BST: 278. First Bad Version ★  (0) 2025.01.21
Hashmap: 217. Contains Duplicate  (0) 2025.01.20
HashMap 구현  (0) 2025.01.20
Heap-PrioiryQueue: 215. Kth Largest Element in an Array ★  (0) 2025.01.20