ソートされた整数の配列があるとします。
{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);
}