Java 如何在二维数组中找到两个给定位置之间的中间位置

Java 如何在二维数组中找到两个给定位置之间的中间位置,java,optimization,logic,Java,Optimization,Logic,我有一个2D数组,我想在其中找到两个给定位置之间的中间位置: 下图显示了每个位置的索引 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,类似地,iEn

我有一个2D数组,我想在其中找到两个给定位置之间的中间位置: 下图显示了每个位置的索引

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
矩阵,即
I
可以走的最大值是
n
,而
j
可以走的最大值是
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;
        }
      }
  }
}
void getMiddle(int-iStart、int-jStart、int-iEnd、int-jEnd、int-jMax){
int numberOfRows=(iEnd-iStart)+1;
int totalElementsInRows=jMax*numberOfRows;
int-EliminateStartements=jStart;
int-EliminateDeletes=(jMax-1)-jEnd;
int totalElementsPresentBetweenPositions=totalElementsInRows-(EliminateStarteElements+eliminateEndElements);
int halfElement=各位置之间存在的元素总数/2;
int countElement=0;

对于(int i=iStart;i这是一种错误的方法,请参见下面的评论部分

////////////////////////////

您可以找到点之间的平均值。当您有点A和点B时,程序必须在两个维度上计算平均值:
x=(Ax+Bx)/2
。在y轴上也是如此


您不必担心数字末尾附加的.5,因为Java会为您截断它。

应该有一种方法可以通过几何方法来实现这一点

找到你想要得到的两点之间的中点,因此如果你想找到mat[0][0]和mat[2][2]之间的位置,你可以找到中点:

mid=(数学abs(x1-x2)/2,数学abs(y1-y2)/2)

x=(2-0)/2=1 y=(2-0)/2=1

所以答案是mat[1][1]

如果它是一个不那么简单的示例,例如mat[0][2]和mat[3][3]:

我们首先找到中点,例如:

x=(3-0)/2=1.5 y=(3-2)/2=0.5


将答案四舍五入到最接近的整数以获得正确的索引

您可以通过在相应位置想象具体的数字而不是索引来简化任务,索引的范围从
0到nx m-1
。类似于:

 0,  1,  2,  3
 4,  5,  6,  7
 8,  9, 10, 11
12, 13, 14, 15
那么m[i][j]处的每个元素都适用

m[i][j] = i * m[i].length + j

对于每个k,
0,我试图理解,但是这不会有帮助,因为预期的解决方案之间存在巨大的差距,例如,第一个位置为23,第二个位置为33,它永远不会到达中间位置,你可以用预期的outputOk检查有问题的输入,你能告诉我它应该产生什么吗?你没有显示测试用例。我的方法会给出23,但实际结果是什么?好吧,我不理解这个问题。很抱歉没有理解就回答了。这个问题取决于矩阵的大小,即mxn,这里m=3,n也=3。所以要找到中间值,这是两个重要的因素,简单点,我取了m=n=3。好的,你想要吗要重新排列矩阵,并在“一维”中找到中点?这不是一个几何图形问题,而是一个二维矩阵问题,您可以通过问题中给定的输入和所述的输出来验证您的解决方案。
 i = k / m
 j = k % m
static void getMiddle(int iStart, int jStart, int iEnd, int jEnd, int iMax, int jMax) {
    int s = iStart * jMax + jStart;
    int e = iEnd * jMax + jEnd;
    int mid_i = ((e+s)/2)/jMax;
    int mid_j = ((e+s)/2)%jMax;
    System.out.println("midd_i = "+ mid_i +" and midd_j = "+mid_j);
}
getMiddle(0, 0, 2, 2, 4, 4);
getMiddle(0, 2, 2, 3, 4, 4);
getMiddle(1, 0, 3, 1, 4, 4);

midd_i = 1 and midd_j = 1
midd_i = 1 and midd_j = 2
midd_i = 2 and midd_j = 0