본문 바로가기

이분 탐색

All about 이분탐색

1. [left, right]가 check(left) != check(right)가 되도록 구간 설정

즉, True, False가 반대여야 한다.

 

2.

while(left + 1 < right)

-> left와 right 사이에 다른칸이 존재하는가?

mid = (left + right) / 2

Check(mid) = Check(left)이면

left = mid;

아니라면

right = mid;

 

3. 구한 경계에서 답이 left인지 right인지 생각해보고 출력

최대를 최소화

F F F F T T T T  -> right가 정답

최소를 최대화

T T T T F F F F -> left가 정답

 

left, right는 항상 정답의 범위를 나타낼 수 있도록 해야한다.

 

배열을 출력하는 이분 탐색의 경우

left = -1, right = n으로 설정!!

 

lower_bound, upper_bound 직접 구현

F F F T T -> right가 정답이 된다.

0 ~ n -1이 right의 정답으로 가능하므로

left = -1, right = n을 넣는다.

 

<소스 코드>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// F F F T T
// right가 정답
int LowerBound(const vector<int>& v, int x) {
    int left = -1;
    int right = (int)v.size();
 
    while (left + 1 < right) {
        int mid = (left + right) / 2;
        if (v[mid] >= x)
            right = mid;
        else
            left = mid;
    }
    return right;
}
cs

 

upper_bound는 등호 빼면 끝

'이분 탐색' 카테고리의 다른 글

공유기 설치  (0) 2024.08.19
나무 자르기  (0) 2024.08.18
국가 행정  (0) 2024.03.03
랜선 자르기  (0) 2024.02.27
수 이어 쓰기 2  (1) 2024.02.26