Выполнить два двоичных поиска:
В первом поиске вы выбираете левую половину, если средний элемент равен искомому элементу.
Во втором поиске вы выбираете правую половину, если средний элемент равен искомому элементу.
Пример кода на Java:
class Test {
public static int findElem(int[] arr, int elem, int l, int h,boolean first) {
if (h - l <= 1)
return first ? (arr[l] == elem ? l : h) : (arr[h] == elem ? h : l);
int m = l + (h - l) / 2;
if (arr[m] < elem || (arr[m] == elem && !first))
return findElem(arr, elem, m, h, first);
return findElem(arr, elem, l, m, first);
}
public static int findElem(int[] arr, int elem, boolean first) {
return findElem(arr, elem, 0, arr.length, first);
}
public static void main(String[] args) {
int[] arr = { 0, 1, 2, 2, 2, 3, 3, 4, 4, 5 };
int elem = 2;
System.out.println("First index: " + findElem(arr, elem, true));
System.out.println("Last index : " + findElem(arr, elem, false));
}
}