Самый быстрый способ, который я могу придумать, это создать массив:
E[0] = 0
E[i] = x-coordinate indicating where the i-th ends.
В вашем примере это будет E = {0, 100, 150, 225, 350, 375, ...}
.
Чтобы найти положение любой точки, вы можете просто выполнить бинарный поиск в этом массиве, давая вам время O (lg (n)) на запрос.
Просто, чтобы помочь, добавил небольшой кусочек кода:
int bs(int[] m, int l, int r, int dot){
int i = (l + r) / 2;
if(m[i - 1] < dot && dot < m[i]) return i;
if(m[i - 1] == dot) return max(1, i - 1);
if(m[i] == dot) return i;
if(dot < m[i]) return bs(m, l, i, dot);
else return bs(m, i + 1, r, dot);
}
Аргументы bs
:
m
: ваш массив. l
: вы всегда должны использовать 1. r
: вы всегда должны использовать n - 1
, где n
- длина m
. dot
: координата x вашей точки.
Пример: если вы хотите найти позицию вашей второй точки (в позиции x = 230), вам следует позвонить
bs(E, 1, E.length - 1, 230)
, и она вернет 4.
Если вы попытаетесь запустить этот метод с x-координатой, которая выходит за границы массива (например, если последний прямоугольник заканчивается в позиции x = 100, и вы ищете точку в x = 101 ), могут случиться странные вещи.