Как использовать двоичный поиск в отсортированном массиве, чтобы найти число целых чисел в определенном диапазоне. (с дубликатами)

Допустим, у вас есть отсортированный массив целых чисел:

{3,4,4,6,10,15,15,19,23,23,24,30}

И вы хотите найти количество целых чисел, которые находятся в диапазоне от 4 до 23.

{4,4,6,10,15,15,19,23,23}

Таким образом, результат будет 9.

Я написал реализацию двоичного поиска, но я не уверен, как бы я изменил ее, чтобы учесть тот факт, что может быть несколько целых чисел, которые соответствуют верхним границам диапазона.

Я думал о добавлении логического значения в сигнатуру метода, чтобы спросить, нужно ли искать верхние границы ключа, но я не уверен, что это можно сделать одним методом, сохраняя сложность O (log (N)).

Или есть какой-то другой способ найти количество элементов в этом диапазоне в отсортированном массиве за O (log (N)) времени?

Это то, что я до сих пор:

int start = rangeBinarySearch(arr, 4, false);
int end = rangeBinarySearch(arr, 23, true); // true would indicate that I want the position of the last occurrence of the key.

int totalInRange = (Math.abs(end) - Math.abs(start) -1)


private static int rangeBinarySearch(int[] items, int key, boolean lastIndex) {
    if(items == null)
        throw new IllegalArgumentException();

    int start = 0;
    int end = items.length - 1;

    while(start <= end) {
        int mIndex = (start + end) / 2;
        int middle = items[mIndex];

        if(middle < key)
            start = (mIndex +1);
        else if(middle > key)
            end = (mIndex -1);
        else
            return mIndex; // Possible something here to find the upper bounds?
    }

    return -(start +1);
}

Ответы на вопрос(3)

Ваш ответ на вопрос