lower bound와 upper bound
lower-bound upper-bound
lower bound
- key 값보다 크거나 같은 수가 처음 등장하는 위치
- cpp
- STL(algorithm lib)로 lower_bound()가 존재하여 사용하면 된다.
int index = lower_bound(arr, arr + N, key) - arr; int index = lower_bound(vec.begin(), vec.end(), key) - vec.begin();
- STL(algorithm lib)로 lower_bound()가 존재하여 사용하면 된다.
- java
static int lowerBound(int[] arr, int key) { int res = 0; int left = 0, right = arr.length - 1; while (left <= right) { int mid = (left + right) / 2; if (key <= arr[mid]) { res = mid; right = mid - 1; } else left = mid + 1; } return res; }
upper bound
- key 값을 초과하는 수가 처음 등장하는 위치(key값보다 작거나 같은 수가 마지막으로 등장하는 위치의 다음 위치)
- cpp
- STL(algorithm lib)로 upper_bound()가 존재하여 사용하면 된다.
int index = upper_bound(arr, arr + N, key) - arr; int index = upper_bound(vec.begin(), vec.end(), key) - vec.begin();
- STL(algorithm lib)로 upper_bound()가 존재하여 사용하면 된다.
- java
static int upperBound(int[] arr, int key) { int res = 0; int left = 0, right = arr.length - 1; while (left <= right) { int mid = (left + right) / 2; if (key < arr[mid]) { // lowerBound에서 등호만 빼면 된다. res = mid; right = mid - 1; } else { left = mid + 1; } } return res; }