У меня есть двумерный массив, в котором я хочу найти среднюю позицию между двумя заданными позициями: ниже, например, показывает индексы в каждой позиции.
00, 01, 02, 03
10, 11, 12, 13
20, 21, 22, 23
30, 31, 32, 33
Входные данные:
-
Для позиций 23
и 33
я должен получить выходную позицию 31
. Здесь входными данными являются iStart, равный 2, и jStart, равный 3, аналогично iEnd, равный 3, и jEnd, равный 3. Ожидаемое значение o / p равно i_mid = 3 и j_mid = 1
Для позиции 00
и 22
Я должен получить выходную позицию 11
. Здесь входные значения iStart равны 0, а jStart также равны 0, аналогично iEnd и jEnd равны 1 Ожидаемое значение o / p равно i_mid = 1 и j_mid = 1
Для позиции 02
и 23
Я должен получить выходную позицию 12
. Здесь входными данными являются iStart, равный 0, и jStart, равный 2, аналогично iEnd, равный 2, и jEnd, равный 3. Ожидаемое значение o / p равно i_mid = 1 и j_mid = 2
- Для позиции
10
и 31
Я должен получить выходную позицию 20
. Здесь входными данными являются iStart, равный 3, и jStart, равный 1, аналогично iEnd, равный 3, и jEnd, равный 1. Ожидаемое значение o / p равно i_mid = 2 и j_mid = 0
. знать длину массива как матрицу n
x m
, ie. максимальное значение i
может go составляет n
, а максимальное значение j
может go составляет m
. поэтому для n
x m
массива iMax
будет n
и jMax
будет m
Теперь функция может быть представлена как:
void getMiddle(int iStart, int jStart, int iEnd, int jEnd, int iMax, int jMax) {
//We need to find the mid_i and mid_j of the input positions
System.out.println("midd_i = "+ mid_i +" and midd_j = "+mid_j);
}
Я решил это методом грубой силы, однако я ищу оптимальное решение.
В моем подходе сначала я нахожу количество элементов, которые могут находиться между данной позицией, а затем я разделил число элемента на 2 и пересекают положение до половины элементов, которые могут прийти, поскольку эта точка будет серединой, мое решение следующее:
void getMiddle(int iStart, int jStart, int iEnd, int jEnd, int jMax) {
int numberOfRows = (iEnd - iStart) + 1;
int totalElementsInRows = jMax * numberOfRows;
int eliminateStartElements = jStart;
int eliminateEndElements = (jMax - 1) - jEnd;
int totalElementsPresentBetweenPositions = totalElementsInRows - (eliminateStartElements + eliminateEndElements);
int halfElement = totalElementsPresentBetweenPositions/2;
int countElement = 0;
for(int i = iStart; i<= iEnd; i++) {
for(int j = 0; j< jMax; j++) {
countElement++;
if(halfElement == countElement) {
System.out.println("midd_i = "+ i +" and midd_j = "+j);
break;
}
}
}
}
Я уверен, что должно быть оптимальное решение, Если у кого-нибудь есть оптимальное решение, помогите.