Java 如何在二维数组中找到两个给定位置之间的中间位置
我有一个2D数组,我想在其中找到两个给定位置之间的中间位置: 下图显示了每个位置的索引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
00, 01, 02, 03
10, 11, 12, 13
20, 21, 22, 23
30, 31, 32, 33
投入:
- 对于位置
和23
我应该获得输出位置33
。 这里的输入是iStart是2,jStart是3,类似地,iEnd是3,jEnd是3 预期o/p为i_mid=3和j_mid=131
- 对于位置
和00
我应该获得输出位置22
。 这里的输入是iStart为0,jStart也为0,类似地,iEnd和jEnd等于1 预期o/p为i_mid=1和j_mid=111
- 对于位置
和02
我应该获得输出位置23
。 这里的输入是iStart为0,jStart为2,类似地,iEnd为2,jEnd为3 预期o/p为i_mid=1和j_mid=212
- 对于位置
和10
我应该获得输出位置31
。 这里的输入是iStart是3,jStart是1,类似地,iEnd是3,jEnd是1 预期o/p为i_mid=2和j_mid=020
n
xm
矩阵,即I
可以走的最大值是n
,而j
可以走的最大值是m
。
因此,对于n
xm
数组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