알고리즘
[JS 알고리즘] 특정 범위에 해당하는 원소 개수 구하기(lowerBound,upperBound)
워딩이
2023. 12. 27. 09:23
lowerBound(arr,x)
정렬된 순서를 유지하면서 배열 arr에 x를 넣을 가장 왼쪽 인덱스를 반환
upperBound(arr,x)
정렬된 순서를 유지하면서 배열 arr에 x를 넣을 가장 오른쪽 인덱스를 반환
const lowerBound = (arr, target, start, end) => {
while (start < end) {
let mid = parseInt((start + end) / 2);
if (arr[mid] >= target) end = mid;
else start = mid + 1;
}
return end;
};
const upperBound = (arr, target, start, end) => {
while (start < end) {
let mid = parseInt((start + end) / 2);
if (arr[mid] <= target) start = mid + 1;
else end = mid;
}
return start;
};
const countByRange = (arr, leftValue, rightValue) => {
let rightIndex = upperBound(arr, rightValue, 0, arr.length - 1);
let leftIndex = lowerBound(arr, leftValue, 0, arr.length - 1);
return rightIndex - leftIndex;
};
let target = 3;
let arr = [1, 2, 2, 2, 3, 4];
console.log(countByRange(arr, target, target)); //1
console.log(countByRange(arr, -1, 2)); //4
