Если ваши данные являются целыми, то этот хак может помочь.Он использует массив с плавающей запятой для хранения значений.
float array[]; //contains all integral values
int searchValue;
int firstIndex = -(binarySearch(array, (float)searchValue - 0.5F) + 1);
По сути, он находит индекс вставки значения между поисковым значением и целым числом перед ним.Поскольку все значения являются целыми, он находит первое вхождение искомого значения.
Также выполняется: log (n) time.
Пример:
import java.util.Arrays;
public class BinarySearch {
// considering array elements are integers
float ar[] = new float[] { 1, 2, 3, 3, 4, 4, 5, 9, 9, 12, 12 };
public void returnFirstOccurrence(int key) {
int firstIndex = -(Arrays.binarySearch(ar, key - 0.5F) + 1);
if (ar[firstIndex] != key)
System.out.println("Key doesn't exist");
else
System.out.println("First index of key is " + firstIndex);
}
public static void main(String Args[]) throws Exception {
new BinarySearch().returnFirstOccurrence(9);
}
}
ВЫВОД: 7
ps: я использовал этот трюк в нескольких конкурсах кодирования, и он всегда работал хорошо.